c ++前向引用

时间:2011-03-04 14:12:44

标签: c++

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

class parent
{
...stuff in here
}


class child1 : public parent
{
....
}

class child2 : public parent
{
....
}

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

class child2;

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

3 个答案:

答案 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的定义遵循child1child2的定义。到目前为止,child2已不再完整,因此您可以提及其成员。

答案 1 :(得分:0)

尝试

class child1
{
    ...
    class child2 *c;
    ...
};

class child2
{
    ...
    class child1 *c;
    ...
};

答案 2 :(得分:0)

你在谈论前瞻性声明,而不是前瞻性参考。

  

所有课程都必须相同   文件,我正在使用child2的实例   在child1里面,反之亦然。我如何能   在这里进行前向参考?如果我   只是说

class child2;
     

在代码的开头   编译器无法识别它   我在使用它时的父类的子类   child1(因而是虚拟的   功能不起作用)。请帮忙。

你不能通过前瞻声明来“使用”它。按照您的建议使用前向声明:

class child2;

这样你就可以在类中声明函数,然后在某个.cpp文件中定义函数体。