Имеется два класса, первый класс наследует от второго. Есть ли какой-то более "элегантный" способ обращаться к унаследованным членам класса в первом классе без использования "this->var"? Просто в таком случае огромное количество "this->" выглядит не очень. Должно быть, есть более рациональный подход.
zRrr , а в чем состоит проблема не писать this вообще?
Использование this оправдано в исчезающе малом количестве случаев.
Кажется, ситуация твоего вопроса не раскрыта, потому что пока видно что и код твоего ответа тоже является излишним.
template <class T>
class Base {
protected:
int a;
int b;
int c;
};
template <class T>
class Derived : private Base<T> {
public:
Derived() {
a = 1;
b = 2;
c = 3;
}
};
Компилятор жалуется: use of undeclared identifier 'a' use of undeclared identifier 'b' use of undeclared identifier 'c'
В шаблонизированных классах нужно явно указывать наследованные члены класса, по крайней мере меня заставляет это делать компилятор.
В шаблонизированных классах нужно явно указывать наследованные члены класса
Такая формулировка сбивает тебя с толку. Верно отражающая действительность формулировка будет такой:
В в области видимости шаблона типа через неквалифицированный доступ видны только поля самого шаблона и локальные переменные. a = 1; - это попытка обращения к полю через неквалифицированный доступ.
В момент инстанцирования типа из шаблона транслятор это поле искать будет только внутри самого шаблона и не найдет, т.к. поле лежит в другом шаблоне и для доступа туда уже требуется квалификация. this для квалификации, хоть это и работает, использовать в таком случае вообще неправильно.
using Base<T>::var; - это операция создания псевдонима поля в локальной области видимости шаблона типа. И это не всегда удобно. И это приведет к проблемам если такое имя уже есть в локальной области шаблона типа или если ты это поле переименуешь в базовом шаблоне. А еще это снова будет сбивать тебя с толку, т.к. в месте работы с полем не будет понимания, откуда это поле взялось.
Самый удобный и универсальный способ - это использование полной квалификации поля или метода при обращении.