foo.hpp
Код: Выделить всё
struct foo {
private:
friend struct bar;
int i;
foo(int _i) :i (_i) {}
};
Код: Выделить всё
namespace {
struct bar {
static foo g() { return foo(1); }
};
}
Однако это не удается, поскольку bar не может получить доступ к закрытым членам foo.
Причина, по которой я это делаю, заключается в том, что я пишу библиотеку, которая предоставляет foo, которая на самом деле является реализацией класса-оболочки, доступного пользователям, скажем, struct foobaz. Я не хочу, чтобы пользователи библиотеки копались в foo, поэтому я сделал все ее члены частными (вы можете представить себе объявление друга для foobaz где-то там).
Теперь bar реализован в исходном файле, и я хочу сделать так, чтобы bar был помечен как скрытый и был локальным (с внутренней связью), то есть я хочу, чтобы его можно было использовать только в foo.cpp и не отображается в объектном файле моей библиотеки. Я знаю, что могу пометить его как скрытый с помощью атрибутов видимости GNU, что решает проблему, но мне не удалось сделать так, чтобы он не был глобальным символом.
Полагаю, я мог бы просто отказаться от структуры и использовать только дружественные функции, но я не хочу, чтобы пользователи случайно наткнулись на это объявление, поскольку его пришлось бы объявлять в заголовке.
Подробнее здесь: https://stackoverflow.com/questions/798 ... ther-class
Мобильная версия