Отменить тень глобального идентификатора в классе

У меня есть следующий код С++:

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).

Да, добавьте int &ident = ::ident; к Derived или промежуточному классу, если вы не можете изменить определение класса Derived.

user207421 17.07.2023 11:43

Да, действительно, но в моем случае первый тип, я отредактировал свой вопрос

mmomtchev 17.07.2023 11:45

Я не понимаю. Теперь ident не является «глобальной переменной»: это тип. Что именно вы ожидаете от ident = 0, если его можно заставить ссылаться на тип?

user207421 17.07.2023 11:49

Что ж, теперь вопрос изменил форму, поэтому, конечно, ident = 0; относится к базовому элементу, а не к типу ident. Что бы вы хотели, чтобы ident = 0; делал, когда ident — тип? Неудачная компиляция, я полагаю

Ted Lyngmo 17.07.2023 11:50

Вопрос, который вы задаете, по-прежнему звучит так: «Можно ли сделать так, чтобы ident ссылалась на глобальную переменную в Derived::method()?» хотя. Что ты имеешь в виду? Глобальной переменной нет.

Ted Lyngmo 17.07.2023 11:52

Я хотел бы иметь ident var в качестве члена класса или в качестве локальной переменной в методе — вместо ::ident var.

mmomtchev 17.07.2023 11:53

И что тебе мешает? Ваш вопрос не имеет смысла.

user207421 17.07.2023 11:54

Обновите вопрос и постарайтесь прояснить его.

Ted Lyngmo 17.07.2023 11:54

Вопрос был очень четким, я получил ответ, который искал, проблема в том, что меня систематически минусуют, потому что у некоторых модераторов есть уголовное дело, которое нужно исправить со мной.

mmomtchev 17.07.2023 11:59

Вопрос теряет смысл. Вы пытаетесь присвоить значение 0 определению класса. Это не законный С++. У вас нет никакой информации о том, кто проголосовал против вашего вопроса, но, к вашему сведению, я был одним из них, и я, конечно, не модератор здесь. И с тех пор, как вы отредактировали, теперь нет «глобальной переменной в Derived::method()» или вообще какой-либо Derived::method(). Не обвиняйте других людей в явных недостатках и внутренних противоречиях в вашем собственном вопросе.

user207421 17.07.2023 12:04

Я по-прежнему абсолютно убежден, что настоящая проблема заключается в уголовном деле.

mmomtchev 17.07.2023 12:15

«Вопрос был очень ясен». Как вы можете сказать, что, когда вы спросили «Можно ли сделать так, чтобы ident ссылалась на глобальную переменную в Derived::method()?» но тогда у вас была не глобальная переменная, а тип с именем ident? Тот факт, что вы приняли ответ, где ident является переменной, в то время как есть ответ, который относится к ident как к типу, делает его еще более загадочным.

Ted Lyngmo 17.07.2023 13:57
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
12
56
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Если вы сделаете базу зависимой от параметра шаблона:

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 17.07.2023 12:02

@user207421 user207421 Вопрос был отредактирован за 9 секунд до того, как я его опубликовал. Изначально глобальная ident была переменной.

HolyBlackCat 17.07.2023 12:13

Вы можете добавить псевдоним, чтобы скрыть базовый элемент:

class Derived : public Base {
  using ident = ::ident;
  ::ident var1; // OK, as before
  ident var2;   // OK, refer to typename Derived::ident (and so ::ident)
};

Другие вопросы по теме

Похожие вопросы

С++ идемпотентность прохождения: указатель → ссылка → указатель
Что может быть хорошим способом проверить, имеют ли значения N вариантов, возвращаемых из разных функций?
Что может быть хорошим способом проверить, имеют ли значения N вариантов, возвращаемых из разных функций?
Возвращает добавление пакета вариативных параметров
Как обнаружить отсутствующий инициализатор элемента строкового массива во время компиляции?
Не удалось вызвать функцию с помощью GetProcAddress в моей собственной dll
Почему мне нужно передавать std::span для строкового аргумента при использовании std::thread в C++?
Почему это дает мне ошибку «Использует неопределенную структуру», когда структура четко определена?
Извлеките тип из шаблона, но не делайте этого для всех типов
Печать ответа напрямую с помощью cout дает неправильный ответ, тогда как сохранение ответа и последующая печать с использованием cout принимаются