簡體   English   中英

c++ 朋友 function 和私有構造函數

[英]c++ friend function and the private constructor

#include <iostream>
using namespace std;

class A;

class B {
public:
    A createA();
};

class A {
private:
  A() {
      cout << "A Object created" << endl;
  }

  friend A B::createA();
};

A B::createA() {
    A a_obj;
    return a_obj;
}

int main(int argc, char* argv[]) {
    B b;
    A a = b.createA();
}

上面的代碼可以正常工作!

但我有以下問題:-

  1. I tried swapping the position of class A and class B but it produced an error saying that A::A() is inaccessible and trying to access incomplete type class B Why?
  2. 當你寫friend AB::createA();時,誰能幫我理解發生了什么? 它是否試圖立即訪問createA()的定義。

這個有問題的部分是B::createA

在這里,您正在“進入”類型B以提取其成員 function createA 為此,您需要知道完整的類型B 否則,編譯器如何知道在哪里可以找到該成員 function,或者它是否存在?

出於聲明朋友成員 function 的目的,從編譯器實現的嚴格技術角度來看,這不是必需的。 畢竟,此時您不執行任何 function 調用,因此這里沒有什么要解決的。 但這仍然會有問題,因為我也可以寫B::thisfunctiondoesnotexist代替,編譯器也必須接受它。 因此,該語言選擇要求在您使用::拉出它的一些內部時事先知道完整類型。

解決此限制的一種簡單方法(例如,如果您需要避免類之間的循環依賴)是將createA的功能放入免費的 function 而不是成員 function 中。 如果類型僅在該點前向聲明但未定義,則仍然可以聲明依賴於AB的免費 function。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM