尝试引用子类中的抽象对象时收到编译错误

Receiving compilation errors when trying to reference an abstract object in child class

本文关键字:编译 错误 对象 抽象 引用 子类      更新时间:2023-10-16

我试图理解一种在 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)

expressionunop 的上下文中查找,并找到局部成员变量;不是基类。

您需要更改成员的名称:也许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;
}