クラスとをこの順序Baz
で継承するクラスがあるとします。class のコンストラクターは、オブジェクトへのポインターを受け取ります。私がやりたいことは、オブジェクトとしてコンストラクターに渡すことです。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();
}
これは、たまたま私のコンピューターで、コンパイラーを使用して動作します (いくつかのコンパイラーでテスト済み)。this
しかし、2003 年の標準のセクション 9.3.2 では、この方法を使用すると未定義の動作になるので、運が良かったのではないかと少し不安になります。厳密に言えば、イニシャライザ リストはコンストラクタの本体の外にあります。関連するテキストは次のとおりです。
9.3.2
this
ポインター非静的メンバー関数
の本体では、キーワードthis
は非左辺値式であり、その値は関数が呼び出されるオブジェクトのアドレスです。
私の使用法は合法で明確に定義されていますか、それとも未定義の動作ですか?