gpt4 book ai didi

c++ - 接收 undefined reference 错误c++继承/多态性

转载 作者:行者123 更新时间:2023-11-30 02:22:39 27 4
gpt4 key购买 nike

我正在学习如何用 C++ 编程,并且正在尝试多态性。当我将这些 cpp 文件编译成目标文件时,我没有收到任何错误。当我尝试制作可执行文件时,出现以下错误:

/tmp/ccsiYtzo.o: In function `expression::expression()':
constant.cpp:(.text._ZN10expressionC2Ev[_ZN10expressionC5Ev]+0x30): undefined reference to `vtable for expression'
/tmp/ccsiYtzo.o:(.rodata+0x24): undefined reference to `typeinfo for expression'
collect2: error: ld returned 1 exit status

我正在使用以下命令进行编译:

g++ constant.cpp main.cpp -o expression

我对这个错误消息的理解是必须定义构造函数表达式,但我相信我已经定义了它。此外,我试图排除声明/定义 expression() 因为默认构造函数应该工作;但是,它会导致相同的错误。非常感谢一些指导。

表达式.h

class expression{
public:
expression(){}
int virtual eval();
char virtual * infix();
char virtual * postfix();
};

class constant : public expression{
public:
constant(int);
int eval();
char * infix();
char * postfix();
private:
int constantInt;
};

常量.cpp

#include "expression.h"
#include <stdio.h>
#include <stdlib.h>

constant::constant(int i){
constantInt = i;

}

int constant::eval(){
return constantInt;
}

char * constant::infix(){
char *retval = (char *) malloc(sizeof(char));
sprintf(retval, "%d", constantInt);
return retval;
}

char * constant::postfix(){
return infix();
}

主要.cpp

#include <iostream>
#include "expression.h"

using namespace std;
int main(){

expression *test = new constant(5);

cout << test -> eval();

return 0;

}

最佳答案

首先,您应该插入 include guards在你的 .h 文件中。

您的问题是您使用 with virtual 关键字声明了您的 class expression,但没有创建抽象(以 = 0 结尾)。这意味着编译器希望看到它的定义。

要解决您的问题,或向您的类添加定义:

class expression{
public:
expression(){}
virtual ~expression() {}
int virtual eval() {}
char virtual * infix() {}
char virtual * postfix() {}
};

或者将其抽象化:

class expression{
public:
expression(){}
virtual ~expression() {};
int virtual eval() = 0;
char virtual * infix() = 0;
char virtual * postfix() = 0;
};

关于c++ - 接收 undefined reference 错误c++继承/多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47018591/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com