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

У меня два занятия говорят 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 создается первым? Если это так, какие-либо предложения о том, как это исправить?

0

Решение

я использую 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 также не является надежным решением, поскольку может делегировать фактическую конструкцию какой-либо другой функции.

3

Другие решения