Как мне сделать так, чтобы «дружественная структура», которая обращается к частным членам другого класса, имела внутреннC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как мне сделать так, чтобы «дружественная структура», которая обращается к частным членам другого класса, имела внутренн

Сообщение Anonymous »

У меня следующая ситуация (упрощенная, чтобы лучше понять суть).
foo.hpp

Код: Выделить всё

struct foo {
private:
friend struct bar;
int i;
foo(int _i) :i (_i) {}
};
foo.cpp

Код: Выделить всё

namespace {
struct bar {
static foo g() { return foo(1); }
};
}
godbolt
Однако это не удается, поскольку bar не может получить доступ к закрытым членам foo.
Причина, по которой я это делаю, заключается в том, что я пишу библиотеку, которая предоставляет foo, которая на самом деле является реализацией класса-оболочки, доступного пользователям, скажем, struct foobaz. Я не хочу, чтобы пользователи библиотеки копались в foo, поэтому я сделал все ее члены частными (вы можете представить себе объявление друга для foobaz где-то там).
Теперь bar реализован в исходном файле, и я хочу сделать так, чтобы bar был помечен как скрытый и был локальным (с внутренней связью), то есть я хочу, чтобы его можно было использовать только в foo.cpp и не отображается в объектном файле моей библиотеки. Я знаю, что могу пометить его как скрытый с помощью атрибутов видимости GNU, что решает проблему, но мне не удалось сделать так, чтобы он не был глобальным символом.
Полагаю, я мог бы просто отказаться от структуры и использовать только дружественные функции, но я не хочу, чтобы пользователи случайно наткнулись на это объявление, поскольку его пришлось бы объявлять в заголовке.

Подробнее здесь: https://stackoverflow.com/questions/798 ... ther-class
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»