我几乎在stackoverflow用户的帮助下解决了我的代码问题,但现在有了不同的问题。我的代码现在看起来像这样:
#include <iostream>
#include <cmath>
#include <sstream>
using namespace std;
class root
{
public:
virtual ~root() {}
virtual root* addA(const root& a) const=0;
virtual root* addB(const root& b) const=0;
};
class bb;
class aa: public root
{
public:
aa() { }
aa(const aa& a) { }
root* addA(const root& a) const
{
return new aa();
}
root* addB(const root& b) const
{
return new bb();
}
};
class bb: public root
{
public:
bb() { }
bb(const bb& b) { }
root* addA(const root& a) const
{
return new aa();
}
root* addB(const root& b) const
{
return new bb();
}
};
int main(int argc, char **argv)
{
}
但是当我编译它时,它会出错:
/home/brain/Desktop/Temp/Untitled2.cpp||In member function ‘virtual root* aa::addB(const root&) const’:|
/home/brain/Desktop/Temp/Untitled2.cpp|30|error: invalid use of incomplete type ‘struct bb’|
/home/brain/Desktop/Temp/Untitled2.cpp|15|error: forward declaration of ‘struct bb’|
||=== Build finished: 2 errors, 0 warnings ===|
答案 0 :(得分:4)
对于这种特定情况,您可以将成员函数的定义移动到定义了类bb
之后。或者最好将它们放在单独的.cpp
文件和include
标题中。
class aa: public root
{
public:
// ....
root* addB(const root& b) const;
// Declaration only
};
class bb: public root
{
public:
// ....
};
// Here.
inline // <--- If you define it in the header.
root* aa::addB(const root& b) const
{
return new bb();
}
答案 1 :(得分:2)
由于编译器对类bb
一无所知,因此它无法创建对象并将其返回return bb()
如果您在课堂外定义root* addB(const root& b) const
,它将会有效,因为那时它将能够知道课程bb
的大小。