尝试引用子类中的抽象对象时收到编译错误
Receiving compilation errors when trying to reference an abstract object in child class
我试图理解一种在 c++ 中创建多态解决方案的纯虚拟方法。我目前有 3 个类,表达式(抽象)、常量(表达式之子)和 unop(表达式之子)。类 unop 保存对另一个表达式的引用(它可以保存 unop、常量或将来的二进制表达式)。当我尝试编译 unop 时.cpp出现以下错误:
unop.cpp:6:20: error: ‘expression’ is not a type
unop::unop(char c, expression *e){
^
unop.cpp:6:1: error: prototype for ‘unop::unop(char, int*)’ does not match any in class ‘unop’
unop::unop(char c, expression *e){
^
In file included from unop.cpp:2:0:
expression.h:21:7: error: candidates are: unop::unop(const unop&)
class unop: public expression{
^
expression.h:23:2: error: unop::unop(char, expression*)
unop(char, expression*);
^
expression.h:29:14: error: ‘expression* unop::expression’ is private
expression *expression;
^
unop.cpp:6:20: error: within this context
unop::unop(char c, expression *e){
我的代码如下:
表达式.h
class expression{
public:
expression(){}
virtual ~expression() {}
int virtual eval() = 0;
char virtual * infix() = 0;
char virtual * postfix() = 0;
};
class constant : public expression{
public:
constant(int);
int eval();
char * infix();
char * postfix();
private:
int constantInt;
};
class unop : public expression{
public:
unop(char, expression*);
int eval();
char * infix();
char * postfix();
private:
char operatorChar;
expression *expression;
};
常数.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(100 * sizeof(char));
sprintf(retval, "%d", constantInt);
return retval;
}
char * constant::postfix(){
return infix();
}
项目厅.cpp
#include "expression.h"
#include <stdio.h>
#include <stdlib.h>
unop::unop(char c, expression *e){
operatorChar = c;
expression = e;
}
int unop::eval(){
return 0;
}
char * unop::infix(){
return NULL;
}
char * constant::postfix(){
return NULL;
}
主.cpp
#include <iostream>
#include "expression.h"
using namespace std;
int main(){
expression *test = new constant(5);
cout << test -> eval();
return 0;
}
任何帮助将不胜感激。我开始慢慢理解发生了什么,但我发现这比我使用过的其他语言要复杂得多。
问题是:
class unop : public expression{
public:
unop(char, expression*);
int eval();
char * infix();
char * postfix();
private:
char operatorChar;
expression *expression; // <<<HERE
};
当你写:
unop::unop(char c, expression *e)
expression
在 unop
的上下文中查找,并找到局部成员变量;不是基类。
您需要更改成员的名称:也许expr
?
编辑:此外,正如Raindrop7指出的那样,unop.cpp
定义了constant::postfix
的另一个(不同的)副本,而不是定义unop::postfix
。 看起来像复制粘贴错误!
有一些错误:
expression *pExpression;
因此,无论您在哪里找到expression =
请将其更改为 pExpression =
.
不能将类型用作标识符,例如:
int int = 0; // error
因此,将其更改为其他内容:
expression* pExpression; // for example
此外,您还有链接时错误:您必须在派生类中实现所有纯虚拟方法才能实例化派生方法:
我想你的意思是:
char * unop::postfix(){ // not char * constant::postfix in Unop.cpp
return NULL;
}
相关文章:
- std::is_base_of表示ctor编译错误
- Qt5:使用QCommandLineParser类时出现奇怪的编译错误
- 如何修复sfml c++代码编译错误
- 使用 MATLAB 编码器生成C++代码:编译错误"undefined reference to `rgb2gray_tbb_real64'"
- 使用外部SDK工具链文件在VisualStudio上生成项目编译错误
- vscode下的Arduino代码出现意外编译错误
- 第三方 API 中的编译错误 - Visual Studio
- std::cout输出int时出现编译错误
- 奇怪的代码抛出编译错误模板< J,int aSize=10> C2143:语法错误:在"<"之前缺少";"
- 提升图广度优先搜索前置编译错误
- C++ 中的编译错误:未定义对"主"的引用 collect2:错误:ld 返回 1 个退出状态
- 使用带有 ref 参数的成员函数创建线程时出现编译错误
- 我在C++中遇到了这个奇怪的编译错误
- 在C++中使用 Catch 测试框架编译错误"error: expected ';' at end of declaration list"
- 使用 std::enable_if 限制派生类的模板参数时出现编译错误
- 现代OpenGL和GLEW Libraray的编译错误
- C++ 编译错误:意外的类型名称"字符串":预期的表达式
- C ++程序编译错误,找不到/访问文件
- 使用直接大括号初始化时,C++ 编译错误"声明末尾的预期";"
- 为什么传递非静态成员函数会导致编译错误?