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

喜欢

class parent
{
...stuff in here
}


class child1 : public parent
{
....
}

class child2 : public parent
{
....
}

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

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

最佳答案

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

#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的定义遵循child1child2的定义。至此,程序中的child2不再是不完整的,因此您可以提及其成员。
  • 关于c++ - C++正向引用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5194843/

    10-13 07:04