gpt4 book ai didi

C++ 前向引用

转载 作者:太空宇宙 更新时间:2023-11-04 12:20:49 24 4
gpt4 key购买 nike

我知道这可能真的很愚蠢,但是如何对继承的类进行前向引用

喜欢

class parent
{
...stuff in here
}


class child1 : public parent
{
....
}

class child2 : public parent
{
....
}

所有类都必须在同一个文件中,我在 child1 中使用 child2 的实例,反之亦然。我如何在这里进行前向引用?如果我只是说

class child2;

在代码的开头,当我在 child1 中使用它时,编译器无法识别它是 parent 的子类(因此虚函数不起作用)。请帮忙。

最佳答案

将所有建议加到一个可编译示例中,我们有:

#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 类定义中包含 child1::GetSiblingData() 的函数体。这是因为 child2 仍然是一个不完整的类型。正如您正确观察到的那样,编译还不知道 child2 的继承是什么。
  • 请注意,即使存在 child2 的前向声明,也可能会出现 child2 的定义。这个定义意味着 child2 不再是一个不完整的类型。
  • 最后,请注意 child1::GetSiblingData 的定义遵循 child1child2 的定义。到程序中的这一点,child2 不再是不完整的,因此您可以提及它的成员。

关于C++ 前向引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5194843/

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