假设我想在一个.cpp
源文件中找到这种东西:
class A {
public:
void doSomething(B *b) {};
};
class B {
public:
void doSomething(A *a) {};
};
无论如何不执行此操作而不将其拆分为两个单独的文件,并且没有收到编译器错误(doSomething(B *b)
上的语法错误)
答案 0 :(得分:22)
放在第一行:
class B;
答案 1 :(得分:12)
如果我记得很清楚,你可以'预先声明'你的B班。
class B; // predeclaration of class B
class A
{
public:
void doSomething(B* b);
}
class B
{
public
void doSomething(A* a) {}
}
public void A::doSomething(B* b) {}
然后,你的班级'A'知道班级'B'会存在,虽然还没有真正定义。
正如Evan Teran在评论中提到的那样,前瞻性声明确实是正确的术语。答案 2 :(得分:4)
使用
向前声明一个类class B;
or
class A;
但是你仍然无法实现
void doSomething(B *b)
仅使用B的前向声明。所以你必须将doSomething的定义放在完整的A类声明
之下答案 3 :(得分:3)
是。你需要一个前瞻声明:
class B; // add this line before A's declaration
class A {
public:
void doSomething(B *b) {};
};
class B {
public:
void doSomething(A *a) {};
};
答案 4 :(得分:3)
The C++ FAQ Lite回答了这个问题及其他问题。我认真考虑从头到尾阅读那个东西,或者拿到这本书并做同样的事情。
答案 5 :(得分:1)
您可以尝试像
这样的前瞻声明class B;
class A {
void Method( B* );
};
class B{
};
但是你只能为B声明指针和引用变量。如果你想要更多(比如取消引用B *变量的方法),你可以只提供一个声明,然后在同一个文件中定义方法 - 在两个类声明已经可用的时候。
答案 6 :(得分:1)
您需要转发声明B。
class B;
class A
{
public:
void doSomething(B *b) {}
};
class B
{
public:
void doSomething(A *a) {}
};
(顺便说一句,在成员函数花括号之后你不需要分号。:))
答案 7 :(得分:0)
在A:
之前添加另一个B声明class B;
class A {
public:
void doSomething(B *b) {};
};
class B {
public:
void doSomething(A *a) {};
};