Предположим, у меня есть класс Baz
, который наследуется от классов Foo
и Bar
, в этом порядке. Конструктор для класса Bar
принимает указатель на объект Foo
. То, что я хотел бы сделать, это передать this
как Foo
объекта к Bar
конструктора:Использование этого в списке инициализаторов
Baz() : Foo(), Bar(this) {}
Рабочему пример:
#include <iostream>
class Bar;
class Foo {
public:
virtual ~Foo() {}
virtual void parse_bar (Bar&) const = 0;
};
class Bar {
private:
const Foo * parser;
public:
Bar (const Foo * parser_in) : parser(parser_in) {}
virtual ~Bar() {}
void parse_self() { parser->parse_bar (*this); }
};
class Baz : public Foo, public Bar {
public:
Baz() : Foo(), Bar(this) {}
virtual void parse_bar (Bar &) const { std::cout << "Hello World\n"; }
};
int main() {
Baz baz;
baz.parse_self();
}
Это происходит работать на моем компьютере, с моими составителями (испытанными с несколькими из них). Однако в разделе 9.3.2 стандарта 2003 года мне немного неловко, что мне просто повезет, что использование таким образом является неопределенным поведением. Строго говоря, список инициализаторов находится вне тела конструктора. Вот соответствующий текст, курсив мой:
9.3.2
this
указателя
В теле нестатического функции члена, ключевое словоthis
не является именующим выражением, значение которого является адресом объекта для которого вызывается функция.
. Мое использование является законным и четко определенным, или это неопределенное поведение?
Гораздо яснее, чем мой ответ, который я немного удалю. – GManNickG
@GManNickG Dont! Комментарии могут быть полезны для новичков – TeaOverflow
@Evgeni: Извините. :) Новички! Вопрос о наследовании класса? -> [Список книг] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list). – GManNickG