typedef int (*evaluate)(PExp);
typedef void (*printTo)(PExp, FILE *);
typedef void (*Exp_free)(PExp);
class Expression {
public:
virtual int evaluate() abstract;
virtual void printTo(FILE * out) abstract;
virtual void free();
};
class Value : public Expression {
protected:
int value;
Value(int value);
public:
int evaluate();
};
#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');
}
我目前正在尝试实现一些代码,这些代码在使用C ++的同时在C中构造一些对象。类“Expression”和“Value”在C ++中给出,我必须实现类“Constant”,它扩展了C中的“Value”。我不能改变C ++文件中的任何内容(包括新文件),这就是我调用它的原因“值”构造函数由它的错误名称组成。问题是:我可以调用在类“Value”中定义的方法exp_evaluate但是当我尝试覆盖方法exp_printTo(MARKED行)时,它总是给我分段错误,所以我在这里做错了什么?如果我尝试调用该方法,而不是尝试为函数指针指定另一个值,它将按预期终止,因为它是纯虚方法。这是makefile,显示“main”是用3个C ++文件和main.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
这一切都编译,我得到的唯一错误是在运行时。 我希望有足够的信息。 提前谢谢。
答案 0 :(得分:3)
我建议你实现一个调用C ++的小包装器(在C ++中),并使用extern C
使函数具有C链接。这是一种比调用错误的C ++名称更可靠的方法。
如果你真的想知道发生了什么,我恐怕是时候突破gdb
了。