我知道这可能真的很愚蠢,但是如何转发继承类的引用
像
class parent
{
...stuff in here
}
class child1 : public parent
{
....
}
class child2 : public parent
{
....
}
所有类都必须在同一个文件中,我在child1中使用child2的实例,反之亦然。我如何在这里进行前向参考?如果我只是说
class child2;
在代码的开头,当我在child1中使用它时,编译器无法识别它是父类的子类(因此虚函数不起作用)。请帮忙。
答案 0 :(得分:1)
将所有建议添加到一个可编辑的示例中,我们有:
#include <iostream>
class parent {
private:
int m_baseData;
public:
parent(int myData) : m_baseData(myData) {}
int GetData() { return m_baseData; }
};
class child2;
class child1 : public parent {
private:
child2 *m_pChild2;
public:
int GetSiblingData(); /* { return m_pChild2->m_baseData; } */
child1(int myData, child2& c2) : parent(myData), m_pChild2(&c2) {}
};
class child2 : public parent {
public:
child2(int myData) : parent(myData) {}
};
inline
int child1::GetSiblingData() {
return m_pChild2->GetData();
}
int main() {
child2 c2(56);
child1 c1(42, c2);
std::cout << c1.GetSiblingData() << "\n";
}
请注意以下几点:
class2
的前瞻性声明。这声明了一个不完整的类型。可以在指针和引用中使用不完整的类型,但除非声明完整类型,否则不能取消引用这些指针。child1::GetSiblingData()
类定义中包含child1
的函数体。这是因为child2
仍然是不完整的类型。正如您所正确观察的那样,编译还不知道child2
的继承是什么。child2
前向声明,也可能会出现child2
的定义。此定义意味着child2
不再是不完整的类型。child1::GetSiblingData
的定义遵循child1
和child2
的定义。到目前为止,child2
已不再完整,因此您可以提及其成员。答案 1 :(得分:0)
尝试
class child1
{
...
class child2 *c;
...
};
class child2
{
...
class child1 *c;
...
};
答案 2 :(得分:0)
你在谈论前瞻性声明,而不是前瞻性参考。
所有课程都必须相同 文件,我正在使用child2的实例 在child1里面,反之亦然。我如何能 在这里进行前向参考?如果我 只是说
class child2;
在代码的开头 编译器无法识别它 我在使用它时的父类的子类 child1(因而是虚拟的 功能不起作用)。请帮忙。
你不能通过前瞻声明来“使用”它。按照您的建议使用前向声明:
class child2;
这样你就可以在类中声明函数,然后在某个.cpp文件中定义函数体。