функция друга в c ++ и частный конструктор - PullRequest
3 голосов
/ 19 июня 2020
#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. Я пытался поменять местами class A и class B, но это выдает ошибку, говоря, что A::A() недоступен и пытается получить доступ к неполному типу class B Почему?
  2. Может ли кто-нибудь помочь мне понять, что происходит, когда вы пишете friend A B::createA(); пытается ли он получить доступ к определению createA() немедленно.

1 Ответ

3 голосов
/ 19 июня 2020

Эта часть проблемы c - это B::createA.

Здесь вы «входите в» тип B, чтобы извлечь его функцию-член createA. Для этого вам необходимо знать полный тип B. В противном случае, как компилятор узнает, где найти эту функцию-член, и существует ли она вообще? В конце концов, на этом этапе вы не выполняете никаких вызовов функций, поэтому здесь нечего решать. Но это все равно будет проблемой: c, так как я мог бы написать вместо B::thisfunctiondoesnotexist, и компилятор тоже должен был бы это принять. Поэтому язык предпочитает требовать, чтобы полный тип был известен заранее всякий раз, когда вы используете :: для извлечения некоторых из его внутренностей.

Один простой способ обойти это ограничение (если, например, вам нужно избежать cycli c зависимостей между классами) заключается в том, чтобы поместить функциональность createA в бесплатную функцию вместо функции-члена. Бесплатная функция, основанная как на A, так и на B, все еще может быть объявлена, если типы были только объявлены вперед в этот момент, но не определены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...