我很擅长使用C ++而且我实际上遇到了问题。
我有一些A,B,C类定义如下(PSEUDOCODE)
class A
{
...
DoSomething(B par1);
DoSomething(C par1);
...
}
class B
{
A parent;
...
}
class C
{
A parent;
...
}
问题是:
如何制作?如果我只是这样做(因为我总是在c#中完成)它会给出错误。我非常理解这个的原因。 (如果我将B和C的引用(include)添加到自己的头文件中,则尚未声明A)
有什么方法可以解决这个问题吗? (使用void *指针不是imho的方法)
答案 0 :(得分:5)
Forward-declare B
和C
。这样编译器就会在到达类A
的定义之前知道它们存在。
class B;
class C;
// At this point, B and C are incomplete types:
// they exist, but their layout is not known.
// You can declare them as function parameters, return type
// and declare them as pointer and reference variables, but not normal variables.
class A
{
....
}
// Followed by the *definition* of B and C.
P上。 S上。
另外,还有一个与问题无关的提示(看看你是如何来自C#背景的):it's better to pass by const reference than by value:
class A
{
...
void DoSomething(const B& par1);
void DoSomething(const C& par1);
...
}
答案 1 :(得分:3)
对于函数声明,如果未在那里定义函数,则允许参数类型不完整:
class B;
class C;
class A
{
...
R DoSomething(B par1);
R DoSomething(C par1);
...
}
class B
{
A parent;
...
}
class C
{
A parent;
...
}
inline R A::DoSomething(B par1) { ... }
inline R A::DoSomething(C par1) { ... }
因此,您只需在B
和C
完成后定义它们。但由于它们是在类外部定义的,因此将它们设为inline
,因此不同转换单元中的多个定义不会导致链接器错误。
答案 2 :(得分:2)
你应该在A:
之前转发声明B和C类class B;
class C;
class A {
...
};
在A中引用B和C的点,编译器只需要知道它们是什么类型的动物。使用前向声明,您满足编译器。然后你可以正确定义它们。
答案 3 :(得分:1)
使用前瞻声明
您可以定义A类;没有它的实现,在B和C之前,然后再定义它