gpt4 book ai didi

c++ - 类参数编译错误

转载 作者:行者123 更新时间:2023-11-28 00:56:47 26 4
gpt4 key购买 nike

为什么我不能在 StateA 中设置 l->set(new StateB);? (这一行在下面有注释)

它说:

main.cpp: In member function ‘virtual void StateA::writeName(Lap*, char*)’:
main.cpp:19:4: error: invalid use of incomplete type ‘struct Lap’
main.cpp:3:7: error: forward declaration of ‘struct Lap’

但我无法解决这个问题:(

#include <stdio.h>

class Lap;
class State;
class StateB;
class StateA;

class State { public:
virtual void writeName(Lap *l, char *str) = 0;
};
class StateB : public State { public:
void writeName(Lap *l, char *str) {
printf("%s B\n", str);
}
};
class StateA : public State { public:
void writeName(Lap *l, char *str) {
printf("%s A\n", str);
//l->set(new StateB);
}
};
class Lap { public:
State *ss;
Lap(){
printf("[Lap]\n");
set(new StateA);
}

void set(State *s){
ss = s;
}

void writeName(char *str){
ss->writeName(this, str);
}
};

int main()
{
printf("\n\n");

Lap lap;
lap.writeName((char*)"Fulano");
lap.writeName((char*)"Fulano");

printf("\n\n");
return 0;
}

最佳答案

问题是前向声明

class Lap;

只告诉编译器这样一个类存在,并允许您声明指向 Lap 的指针,但它不会为编译器提供足够的信息来处理任何 Lap 方法调用。

所以在尝试使用其方法之前,您需要Lap 完全声明。

对于给定的代码,这不能在单个文件中完成,因为 Lap 执行 new StateAStateA 调用方法Lap -- 循环依赖。

您需要将至少一个(最好是所有)的声明移到头文件中,并在需要的地方包含头文件。然后编译器将在任何一个类的定义尝试使用另一个类中的方法之前了解这些类的完整接口(interface)细节。

关于c++ - 类参数编译错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10711653/

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