У меня есть следующий код С++:
class ident {};
class Base {
public:
int ident;
};
class Derived : public Base {
::ident var; // refers to the global identifier
ident var; // syntax error, refers to the base member
};
Можно ли сделать так, чтобы ident ссылался на глобальный идентификатор в Derived::method()? В итоге совсем спрятались Base::ident? Я не могу изменить Base, но могу сделать промежуточный класс. Я могу добавлять строки везде, но генерация переменных-членов всегда будет ссылаться на ident как ident.
Это очень необычный запрос, потому что он касается генератора шаблонного кода (SWIG).
Да, действительно, но в моем случае первый тип, я отредактировал свой вопрос
Я не понимаю. Теперь ident не является «глобальной переменной»: это тип. Что именно вы ожидаете от ident = 0, если его можно заставить ссылаться на тип?
Что ж, теперь вопрос изменил форму, поэтому, конечно, ident = 0; относится к базовому элементу, а не к типу ident. Что бы вы хотели, чтобы ident = 0; делал, когда ident — тип? Неудачная компиляция, я полагаю
Вопрос, который вы задаете, по-прежнему звучит так: «Можно ли сделать так, чтобы ident ссылалась на глобальную переменную в Derived::method()?» хотя. Что ты имеешь в виду? Глобальной переменной нет.
Я хотел бы иметь ident var в качестве члена класса или в качестве локальной переменной в методе — вместо ::ident var.
И что тебе мешает? Ваш вопрос не имеет смысла.
Обновите вопрос и постарайтесь прояснить его.
Вопрос был очень четким, я получил ответ, который искал, проблема в том, что меня систематически минусуют, потому что у некоторых модераторов есть уголовное дело, которое нужно исправить со мной.
Вопрос теряет смысл. Вы пытаетесь присвоить значение 0 определению класса. Это не законный С++. У вас нет никакой информации о том, кто проголосовал против вашего вопроса, но, к вашему сведению, я был одним из них, и я, конечно, не модератор здесь. И с тех пор, как вы отредактировали, теперь нет «глобальной переменной в Derived::method()» или вообще какой-либо Derived::method(). Не обвиняйте других людей в явных недостатках и внутренних противоречиях в вашем собственном вопросе.
Я по-прежнему абсолютно убежден, что настоящая проблема заключается в уголовном деле.
«Вопрос был очень ясен». Как вы можете сказать, что, когда вы спросили «Можно ли сделать так, чтобы ident ссылалась на глобальную переменную в Derived::method()?» но тогда у вас была не глобальная переменная, а тип с именем ident? Тот факт, что вы приняли ответ, где ident является переменной, в то время как есть ответ, который относится к ident как к типу, делает его еще более загадочным.





Если вы сделаете базу зависимой от параметра шаблона:
template <typename T>
class DerivedLow : public T
{
void method()
{
ident = 0; // Refers to the global entity.
}
};
using Derived = DerivedLow<Base>;
Тогда ничего из базового класса не будет доступно в производном классе по умолчанию. Вы по-прежнему можете получить доступ к членам базы с помощью this-> или Base:: или импортировать их с помощью using.
@mmomtchev Если этот ответ верен, как именно ident = 0 имеет смысл, когда ident - это класс?
@user207421 user207421 Вопрос был отредактирован за 9 секунд до того, как я его опубликовал. Изначально глобальная ident была переменной.
Вы можете добавить псевдоним, чтобы скрыть базовый элемент:
class Derived : public Base {
using ident = ::ident;
::ident var1; // OK, as before
ident var2; // OK, refer to typename Derived::ident (and so ::ident)
};
Да, добавьте
int &ident = ::ident;кDerivedили промежуточному классу, если вы не можете изменить определение классаDerived.