C覆盖C++;方法 出口水电站 表达式.h 常数h expr.h main.c 我目前正在尝试实现一些代码,同时在C中构造一些对象,同时使用C++。类“表达式”和“值”在C++中给出,并且我必须实现在C中扩展“值”的类“常量”,我不能改变C++文件(包括新文件)中的任何东西,所以这就是为什么我称之为“值”构造函数的原因是它的被损坏的名称。问题是:我可以调用类“Value”中定义的方法exp_evaluate,但当我试图重写方法exp_printTo(标记行)时,它总是给我分段错误,那么我在这里做错了什么?。如果我尝试调用该方法,而不是尝试为函数指针分配另一个值,它会按预期终止,因为它是一个纯虚拟方法。这里是Mag文件,显示“主”是用3个C++文件和Maul.C:编译的。 main: use-expr.o expr.o main.o g++ -o use-expr-c use-expr.o expr.o main.o -g use-expr.o: use-expr.cpp expr.hpp g++ -Wall -pedantic -g -c use-expr.cpp -g expr.o: expr.cpp expr.hpp g++ -Wall -pedantic -g -c expr.cpp -g main.o: main.c gcc -Wall -pedantic -std=c99 -g -c -o main.o main.c -g

C覆盖C++;方法 出口水电站 表达式.h 常数h expr.h main.c 我目前正在尝试实现一些代码,同时在C中构造一些对象,同时使用C++。类“表达式”和“值”在C++中给出,并且我必须实现在C中扩展“值”的类“常量”,我不能改变C++文件(包括新文件)中的任何东西,所以这就是为什么我称之为“值”构造函数的原因是它的被损坏的名称。问题是:我可以调用类“Value”中定义的方法exp_evaluate,但当我试图重写方法exp_printTo(标记行)时,它总是给我分段错误,那么我在这里做错了什么?。如果我尝试调用该方法,而不是尝试为函数指针分配另一个值,它会按预期终止,因为它是一个纯虚拟方法。这里是Mag文件,显示“主”是用3个C++文件和Maul.C:编译的。 main: use-expr.o expr.o main.o g++ -o use-expr-c use-expr.o expr.o main.o -g use-expr.o: use-expr.cpp expr.hpp g++ -Wall -pedantic -g -c use-expr.cpp -g expr.o: expr.cpp expr.hpp g++ -Wall -pedantic -g -c expr.cpp -g main.o: main.c gcc -Wall -pedantic -std=c99 -g -c -o main.o main.c -g,c++,c,polymorphism,C++,C,Polymorphism,这一切都在编译,我得到的唯一错误是在运行时。 我希望有足够的信息。 谢谢。 < P>我建议你用C++调用一个小包装器(C++),并使函数具有C链接,使用外c>代码>。这是比调用已损坏的C++名称更可靠的方法。 如果你真的想知道发生了什么,恐怕是时候发布 GDB 。 < P>我建议你实现一个小的包装器(C++),调用C++,使函数有C链接,使用外C*/COD>。这是比调用已损坏的C++名称更可靠的方法。 如果你真的想知道发生了什么,恐怕是时候发布 GDB 。 < P>我建议你实现一个小的包装器(C

这一切都在编译,我得到的唯一错误是在运行时。 我希望有足够的信息。
谢谢。

< P>我建议你用C++调用一个小包装器(C++),并使函数具有C链接,使用<代码>外c>代码>。这是比调用已损坏的C++名称更可靠的方法。


如果你真的想知道发生了什么,恐怕是时候发布<代码> GDB 。

< P>我建议你实现一个小的包装器(C++),调用C++,使函数有C链接,使用<代码>外C*/COD>。这是比调用已损坏的C++名称更可靠的方法。


如果你真的想知道发生了什么,恐怕是时候发布<代码> GDB 。

< P>我建议你实现一个小的包装器(C++),调用C++,使函数有C链接,使用<代码>外C*/COD>。这是比调用已损坏的C++名称更可靠的方法。


如果你真的想知道发生了什么,恐怕是时候发布<代码> GDB 。

< P>我建议你实现一个小的包装器(C++),调用C++,使函数有C链接,使用<代码>外C*/COD>。这是比调用已损坏的C++名称更可靠的方法。


如果你真的想知道发生了什么,恐怕是时候发布<代码> GDB 。

我很欣赏你的评论,但是我不能改变C++中的任何东西,包括新文件:\我一直在使用GBD,我就是这样精确地找出错误的。这一点我根本不明白为什么。在你的问题中,你会说“我不能改变C++文件中的任何东西,这就是为什么我把它称为‘值’构造函数的原因。”澄清你不能添加一个单独的C++文件可能是有用的,尽管我有兴趣知道为什么在地球上没有!您可能尝试使用单独的C++文件并拆解它,以查看它与您的路由的区别(如果您需要C++中的“最终答案”,而不是神秘地删除了<代码> G++< /COD>二进制文件)。我不能更改或添加C++文件的原因是它被要求(不要求)。我知道最简单的方法是创建一个包装器,但由于我不能这样做,我认为最好理解为什么我不能更改函数指针。谢谢你的回答。顺便说一句,我的第二个想法是暂时使用包装器来理解C方法哪里出了问题,然后修复你的C方法。方法常量_printTo实现得很好。我可以单独调用,没有错误。这个错误只发生在我试图在这个函数中分配一个值,在->超级.v.> ExpPrPin(表达式。vTAB-ExpPrtotto)。我很欣赏你的评论,但是我不能改变C++中的任何东西,包括新文件:\我一直在使用GBD,我就是这样精确地找出错误的。这一点我根本不明白为什么。在你的问题中,你会说“我不能改变C++文件中的任何东西,这就是为什么我把它称为‘值’构造函数的原因。”澄清你不能添加一个单独的C++文件可能是有用的,尽管我有兴趣知道为什么在地球上没有!您可能尝试使用单独的C++文件并拆解它,以查看它与您的路由的区别(如果您需要C++中的“最终答案”,而不是神秘地删除了<代码> G++< /COD>二进制文件)。我不能更改或添加C++文件的原因是它被要求(不要求)。我知道最简单的方法是创建一个包装器,但由于我不能这样做,我认为最好理解为什么我不能更改函数指针。谢谢你的回答。顺便说一句,我的第二个想法是暂时使用包装器来理解C方法哪里出了问题,然后修复你的C方法。方法常量_printTo实现得很好。我可以单独调用,没有错误。这个错误只发生在我试图在这个函数中分配一个值,在->超级.v.> ExpPrPin(表达式。vTAB-ExpPrtotto)。我很欣赏你的评论,但是我不能改变C++中的任何东西,包括新文件:\我一直在使用GBD,我就是这样精确地找出错误的。这一点我根本不明白为什么。在你的问题中,你会说“我不能改变C++文件中的任何东西,这就是为什么我把它称为‘值’构造函数的原因。”澄清你不能添加一个单独的C++文件可能是有用的,尽管我有兴趣知道为什么在地球上没有!您可能尝试使用单独的C++文件并拆解它,以查看它与您的路由的区别(如果您需要C++中的“最终答案”,而不是神秘地删除了<代码> G++< /COD>二进制文件)。我不能更改或添加C++文件的原因是它被要求(不要求)。我知道最简单的方法是创建一个包装器,但由于我不能这样做,我认为最好理解为什么我不能更改函数指针。谢谢你的回答。顺便说一句,我的第二个想法是暂时使用包装器来理解C方法哪里出了问题,然后修复你的C方法
#include <stdlib.h>
#include <stdio.h>

typedef struct expression Expression;
typedef Expression * PExp;

typedef int (*evaluate)(PExp);
typedef void (*printTo)(PExp, FILE *);
typedef void (*Exp_free)(PExp);

typedef struct {
    evaluate exp_evaluate;
    printTo exp_printTo;
    Exp_free exp_free;
} vTable;

struct expression {
    vTable * v;
};

void expression_init(PExp this);
void exp_free(PExp this);
#include "Expression.h"

typedef struct {
    Expression super;
    int value;
} Value;

void value_init(Value * this, int value);
int value_evaluate(Value * this);
typedef struct {
    Value super;
} Constant;

void constant_init(Constant * this, int value);
void constant_free(Constant * this);
void constant_printTo(Constant * this, FILE * out);
#include "Expression.h"
#include "Value.h"
#include "Constant.h"
#include "expr.h"

void constant_init(Constant * this, int value) {
    _ZN5ValueC2Ei((Value *)this, value);
    printf("%d\n", this->super.super.v->exp_evaluate((PExp)this));
    this->super.super.v->exp_printTo = (printTo)constant_printTo; // MARK
}

void constant_printTo(Constant * this, FILE * out) {
    fprintf(out, "%d", this->super.value );
    putchar('\n');
}
main: use-expr.o expr.o main.o
    g++ -o use-expr-c use-expr.o expr.o main.o -g

use-expr.o: use-expr.cpp expr.hpp
    g++ -Wall -pedantic -g -c use-expr.cpp -g

expr.o: expr.cpp expr.hpp
    g++ -Wall -pedantic -g -c expr.cpp -g

main.o: main.c
    gcc -Wall -pedantic -std=c99 -g -c -o main.o main.c -g