C重写C ++方法

时间:2014-01-18 16:58:07

标签: c++ c polymorphism

expr.hpp

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();
};

Expression.h

#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);

Value.h

#include "Expression.h"

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

void value_init(Value * this, int value);
int value_evaluate(Value * this);

Constant.h

typedef struct {
    Value super;
} Constant;

void constant_init(Constant * this, int value);
void constant_free(Constant * this);
void constant_printTo(Constant * this, FILE * out);

expr.h中

#include "Expression.h"
#include "Value.h"
#include "Constant.h"

的main.c

#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

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

1 个答案:

答案 0 :(得分:3)

我建议你实现一个调用C ++的小包装器(在C ++中),并使用extern C使函数具有C链接。这是一种比调用错误的C ++名称更可靠的方法。

如果你真的想知道发生了什么,我恐怕是时候突破gdb了。