Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> this в конструкторе 
:(
    Опции темы
neocpp
Дата 16.2.2013, 08:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 21.1.2013

Репутация: нет
Всего: нет



День добрый.

Вопрос такой: можно ли использовать указатель this в конструкторе для доступа к элементам базового класса? Допустим:


Код

class Child : public Base
{
public:
    Child()
    {
        std::cout << this->val << "\n";
    }
};


Как я понимаю, базовая часть объекта создана до выполнения тела конструктора и проблем с доступом быть не должно (проверял на практике, ошибок не было, предупреждений со стороны компилятора тоже). Или моя логика неверна и это, возможно, UB?
PM MAIL   Вверх
bsa
Дата 16.2.2013, 08:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



neocpp, твоя логика верна. Более того, в твоем случае даже this-> писать не надо - компилятор сам догадается.
PM   Вверх
NoviceF
Дата 16.2.2013, 08:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 313
Регистрация: 13.3.2012
Где: Ростов-на-Дону

Репутация: 2
Всего: 2



Излагаю свою версию:

написать 

Код

        std::cout << this->val << "\n";


всёравно, что написать 

Код

        std::cout << val << "\n";


Если член val есть только в базовом классе и он не private, он будет выведен, т.к. базовый класс, является частью наследника.

Если член val находится в private области базового класса - он не выведется. Если в наследнике есть свой val - он перекроет член базового класса с таким же именем и выводиться будет его значение.

В общем this в конструкторе наследника, указывает на наследника, даже если наследник ещё полностью не сконструирован.
PM MAIL   Вверх
neocpp
Дата 16.2.2013, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 21.1.2013

Репутация: нет
Всего: нет



Спасибо, это понял. На самом деле у меня пример немного другой, мне надо вызвать функцию и в нее передать *this, что-то вроде этого:

Код

class Child : public Base
{
public:
    Child()
    {
         foo(*this);
    }
};


Где foo принимает ссылку на объект базового типа... С этим могут быть какие-нибудь проблемы?

Понимаю, какая-то кривая архитектура выходит. Просто мне нужно определенным образом проинициализировать базовую часть объекта, а в базовом классе нет подходящего конструктора. 
PM MAIL   Вверх
mes
Дата 16.2.2013, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(neocpp @  16.2.2013,  10:53 Найти цитируемый пост)
С этим могут быть какие-нибудь проблемы?

если косвенно вызываются виртуальные функции...


--------------------
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0440 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.