C++ c++;正向引用

C++ c++;正向引用,c++,C++,我知道这可能真的很愚蠢,但如何实现继承类的前向引用呢 像 所有的类都必须在同一个文件中,我在child1中使用child2的实例,反之亦然。如何在此处进行正向引用?如果我只是说 class child2; class child2; 在代码的开头,当我在child1中使用它时,编译器没有意识到它是parent的子类(因此虚拟函数不起作用)。请帮忙。试试看 class child1 { ... class child2 *c; ... }; class child2

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

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

class child2;
class child2;
在代码的开头,当我在child1中使用它时,编译器没有意识到它是parent的子类(因此虚拟函数不起作用)。请帮忙。

试试看

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

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


你说的是转发声明,不是转发引用

所有的班级都必须在同一个班级 文件,我正在使用child2的实例 里面是child1,反之亦然。我该怎么办 是否在此处进行正向引用?如果我 就说

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

您根本不能通过转发声明来“使用”它。按照您的建议使用远期声明:

class child2;

这样您就可以在类中声明函数,然后在一些.cpp文件中定义函数体。

您所说的是转发声明,而不是转发引用

所有的班级都必须在同一个班级 文件,我正在使用child2的实例 里面是child1,反之亦然。我该怎么办 是否在此处进行正向引用?如果我 就说

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

您根本不能通过转发声明来“使用”它。按照您的建议使用远期声明:

class child2;

因此,您可以在类中声明函数,然后在一些.cpp文件中定义函数体。

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

#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";
}
#包括
班级家长{
私人:
int m_基础数据;
公众:
父(int myData):m_baseData(myData){}
int GetData(){return m_baseData;}
};
儿童2类;
类别child1:公共父级{
私人:
儿童2*m_pChild2;
公众:
int GetSiblingData();/*{return m_pChild2->m_baseData;}*/
child1(int myData,child2&c2):父(myData),m_pChild2(&c2){}
};
第2类:公共家长{
公众:
child2(int myData):父(myData){}
};
内联
int child1::GetSiblingData(){
返回m_pChild2->GetData();
}
int main(){
儿童2 c2(56);
儿童1 c1(42,c2);

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

#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";
}
#包括
班级家长{
私人:
int m_基础数据;
公众:
父(int myData):m_baseData(myData){}
int GetData(){return m_baseData;}
};
儿童2类;
类别child1:公共父级{
私人:
儿童2*m_pChild2;
公众:
int GetSiblingData();/*{return m_pChild2->m_baseData;}*/
child1(int myData,child2&c2):父(myData),m_pChild2(&c2){}
};
第2类:公共家长{
公众:
child2(int myData):父(myData){}
};
内联
int child1::GetSiblingData(){
返回m_pChild2->GetData();
}
int main(){
儿童2 c2(56);
儿童1 c1(42,c2);

你说的“使用child2的实例”是什么意思如果您指的是实际对象,则不能使用前向声明。只能使用指针和引用。@Maxpm:如果他停止在类定义中内联编写函数体,他可以在函数体中使用实例。:)事实上,前向声明只给他指针/引用用法——在函数decla中可能有用口粮。你说的“使用儿童实例2”是什么意思如果您指的是实际对象,则不能使用前向声明。只能使用指针和引用。@Maxpm:如果他停止在类定义中内联编写函数体,他可以在函数体中使用实例。:)事实上,前向声明只给他指针/引用用法——在函数decla中可能有用关于转发声明及其用法的更多信息您可以阅读更多关于转发声明及其用法的信息