繁体   English   中英

为什么 class 内的 function 的 C++ 友谊与独立的 ZC1C425268E47385D14ZA7 不同?

[英]Why C++ friendship for function inside a class does not work same as a standalone function?

我想知道为什么以下两个代码之一编译而另一个不编译。 在第一个代码中,createB 是一个独立的 function。 在第二个代码中,function createB 是 class A 的成员。

第一个编译。

#include <iostream>

class A;

class B {
public:
  B() { std::cout << "B"; }
  friend B createB();
};

class A {
public:
  A() { std::cout << "A"; }

};

B createB() { return B(); }

int main() {
  A a;
  B b = createB();
}

第二个没有。

#include <iostream>

class A;

class B {
public:
  B() { std::cout << "B"; }
  friend B A::createB();
};

class A {
public:
  A() { std::cout << "A"; }

  B createB() { return B(); }
};

int main() {
  A a;
  B b = a.createB();
}

情况1

在第一个片段中, createB是一个免费的(独立的)function,并且友元声明不一定要命名一个现有的 function。 所以这可行,并且还隐式声明了一个名为createB的 function,其返回类型为B在全局命名空间中,尽管此createB通过普通查找是不可见的。

案例2

第二个示例中的问题A在朋友声明的点是不完整的, friend BA::createB(); .

为了解决这个问题,我们可以将A的定义移到B之前,这样A在友元声明处是完整的。 此外,我们可以在定义B之后提供createB的定义,如下所示:

//forward declaration so that B can be used in declaration B createB();
class B;

class A {
public:
  A() { std::cout << "A"; }
  //this is declaration
  B createB();
};

class B {
public:
  B() { std::cout << "B"; }
  friend B A::createB();    //this works as now at this point A is complete since we moved the definition of A to before B
};

//this is definition 
B A::createB() { return B(); }
int main() {
  A a;
  B b = a.createB();
}

工作演示

暂无
暂无

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

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