У меня два занятия говорят 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
однако для простоты я не упомянул об этом здесь
Однако, когда я пытаюсь собрать программу, я получаю сообщение об ошибке
В экземпляре pen typename boost :: detail :: sp_if_not_array :: type
boost :: make_shared () [с T = бар; имяТипа
boost :: detail :: sp_if_not_array :: type = boost :: shared_ptr] ’: |
/home/…./Projects/CodeBlocks/../bar.cpp|18| требуется здесь |
/home/…./Projects/CodeBlocks/../foo.h|23|error: ‘foo :: foo ()’ is
частный | || === Сборка завершена: 1 ошибка, 2 предупреждения (0 минут, 5
секунд) === |
Это потому, что bar.h создается первым? Если это так, какие-либо предложения о том, как это исправить?
я использую
boost::shared_ptr
однако для простоты я не упомянул об этом здесь
По иронии судьбы, именно это делает ваш код не компилируемым. Без этого пример, который вы показали, компилируется без ошибок.
Проблема в том, что вы пытаетесь использовать boost::make_shared
создать shared_ptr
, Это приведет к make_shared
пытаясь построить foo
что, конечно, не получается, потому что вы объявили bar
быть friend
из foo
х, но make_shared
не является friend
,
Использовать shared_ptr
вместо этого конструктор, и передать ему указатель на foo
объект, который был выделен bar
,
Обратите внимание, что объявление boost::make_shared
как friend
также не является надежным решением, поскольку может делегировать фактическую конструкцию какой-либо другой функции.