繁体   English   中英

具有前向类声明的朋友类无法编译

[英]friend class with forward class declaration does not compile

这是一个基本程序,用于了解如何在C ++中使用friend class

xxx类具有使用friend yyy类对象。 由于类yyy是在类xxx之后定义的,因此我已使用前向声明声明了类yyy

#include<iostream>
using std::cout;
using std::endl;

class yyy; //Forward Declaration of class yyy

class xxx{
private:
  int a;

public:
  xxx(){a=20;yyy y2;y2.show();}       //Error//
  void show(){cout<<"a="<<a<<endl;}
  friend class yyy; //Making class yyy as freind of class xxx
};
class yyy{
private:
  int b;

public:
  yyy(){b=10;}
  void show(){cout<<"b="<<b<<endl;}
};

int main(int argc, char *argv[])
{
  xxx x1; //creating xxx object and calling constructor
  x1.show();
  return 0;
}

当我编译程序时,出现此错误:

错误:聚合'yyy y2'类型不完整,无法定义

我提到了此链接递归朋友类 ,有人回答过像这样https://stackoverflow.com/a/6158833/2168706

我正在采用这种方法,但是仍然无法解决问题。 请提供解决方案(如果存在),如果我在代码中的任何时候错了,请告诉我。

您正在此处实例化不完整类型yyy的对象y2

{ a = 20; yyy y2; y2.show(); } 

将构造函数的实现yyy类的定义下方:

class yyy;

class xxx {
  private:
    int a;

  public: 
    xxx();

    void show() { cout << "a=" << a << endl; }

    friend class yyy;
};

class yyy {
  private:
    int b;

  public:
    yyy() { b = 10; }

    void show() { cout << "b=" << b << endl; }
};

xxx::xxx() { a = 20; yyy y2; y2.show(); } // No error

结果,此时yyy已经定义,您可以实例化y2

为了给您一个合理的解释,为什么您的变体不起作用:当您实例化具有自动存储持续时间 (在堆栈上)的对象(如yyy y2; ,编译器必须在编译时知道应为y2保留多少内存。 由于yyy类型不完整(仅在实例化时才被向前声明),编译器将丢失并报告错误。

注意:最佳实践当然是通过将定义移到头文件( .hpp )和将实现移到源文件( .cpp )来分离类及其实现的定义。 不要忘记适当地包含标题。 我不想在这里给您一个示例,因为它是非常基本的内容,任何C ++书籍或教程都应涵盖。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM