Есть ли способ объявить защищенную переменную C++ извне ее класса?
class A {
public:
A();
int get();
void set();
};
protected int A::var;
Похоже, это будет работать. Тем не менее, он "ожидает неквалифицированный идентификатор перед защитой". Какой правильный способ сделать это?
3 ответа
Как бы компилятор узнал, сколько места нужно выделить для экземпляров класса? Рассматривать
A foo;
protected int A::var;
A bar;
Как бы компилятор узнал, как выделить место для var
когда он выделил foo
? Первая и вторая строки могут быть даже в разных единицах перевода.
Так что нет, это невозможно, потому что это не имеет смысла.
Проще говоря, нет, это не возможно.
в сложных словах, это невозможно, потому что стандарт допускает ключевое слово и спецификатор доступа protected
использоваться только внутри определения класса.
Там нет никакого способа сделать именно то , что вы хотите (как уже говорили другие), но есть "хаки" вокруг этого, если вы просто не хотите раскрывать protected
/ private
члены для пользователей вашего класса. Вы можете создать PrivateBase
а также PublicBase
класс, а затем третий класс, который использует множественное наследование или состав двух предыдущих классов. Как правило, это делается потому, что вы хотите распространять заголовочный файл, но не хотите раскрывать всех своих закрытых участников.
Вот пример такого. Я полагаю, что у Скотта Мейерса есть пример в одной из его книг. Это намного больше работы и делает обслуживание вашей стороны намного сложнее, так что имейте это в виду.