класс не признается другом

0

У меня есть два класса: foo и bar. Конструктор foo является private чтобы позволить классу bar создавать его.

// foo.h   
class foo
{
  friend class bar;
private:
  foo()
  {}
};

// bar.h
class bar
{
public:
  bar()
  {
    foo* f = new foo();
  } 
};

Также я использую boost::shared_ptr однако для простоты я не упоминал об этом здесь

Однако, когда я пытаюсь создать программу, я получаю ошибку

В экземпляре 'typename boost :: detail :: sp_if_not_array :: type boost :: make_shared() [с T = bar; typename boost :: detail :: sp_if_not_array :: type = boost :: shared_ptr]: | /home/..../Projects/CodeBlocks/../bar.cpp|18|required from here | /home/..../Projects/CodeBlocks/../foo.h|23|error: 'foo :: foo() является приватным | || === Сборка завершена: 1 ошибка, 2 предупреждения (0 минут, 5 секунд) === |

Это потому, что bar.h сначала создается? Если да, то какие-либо предложения по устранению этого?

  • 1
    bar может быть другом foo , но boost::make_shared - нет. Вместо этого используйте конструктор boost::shared_ptr .
Теги:
boost
shared-ptr
friend

1 ответ

3
Лучший ответ

Я использую boost::shared_ptr однако для простоты я не упоминал об этом здесь

По иронии судьбы, это то, что делает ваш код не скомпилированным. Без него пример, который вы показали, компилируется без ошибок.

Проблема в том, что вы пытаетесь использовать boost::make_shared для создания shared_ptr. Это приведет к make_shared попытке построить foo, что, конечно, не удастся, потому что вы объявили, что bar является friend foo 's, но make_shared не является friend.

Вместо этого используйте конструктор shared_ptr и передайте ему указатель на объект foo, который был выделен bar.

Демо-версия


Обратите внимание, что объявление boost::make_shared как friend не является надежным решением либо потому, что оно может делегировать фактическую конструкцию какой-либо другой функции.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню