У меня есть два класса: 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 сначала создается? Если да, то какие-либо предложения по устранению этого?
Я использую
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
не является надежным решением либо потому, что оно может делегировать фактическую конструкцию какой-либо другой функции.
bar
может быть другомfoo
, ноboost::make_shared
- нет. Вместо этого используйте конструкторboost::shared_ptr
.