2011-10-20 7 views
4

これはばかげた質問のように思えるが、私は、派生クラスをインスタンス化し、1行で基底クラスに割り当てることができるようにしたい:C++ベースクラスに派生クラスを割り当てるためのより良い方法は

class A { }; 
class B : public A { }; 

// i can do this 
A *base; 
B derived; 
base = &derived; 

// i'd like to do something like this 
A *base; 
base = &B(); // produces a warning: taking address of temporary 

私は新しい演算子を使用せずに多態的な動作を取得しようとしています。私は、コンパイラがコンストラクタの戻り値に一時的な参照を挿入していると思います。私は実際に割り当てのためにそのアドレスを使用したいとコンパイラに指示することは可能ですか?

* EDITは

ここで少し状況です。

class element { virtual void load_xml(...); }; 
class city : public element { ... }; 
class state : public element { ... }; 

element *base; 
// read some xml 

if (xml_node == "city") { 
    base = &city(); 
} else if (xml_node == "state") { 
    base = &state(); 
} 

base.load_xml(...); 

アイデアは、各派生ノードが自身を水和する方法を知っているし、そうすることをload_xml()関数をオーバーライドするということです。私は、XMLファイルを解析する際に、このような何かを持っています。私は本当にすべきことは、それぞれの派生クラスをベースに割り当て、最後にベースからload_xmlを呼び出すのではなく、各ifブロックでload_xmlを呼び出すことだと思います。

ありがとうございます!

+0

VS2010では警告が表示されません。どのコンパイラを使用していますか? –

+0

私は、あなたが言っていることや考えていることの大半は、あなたが望むと思うことは理にかなっていないと思います。あなたは少し前に戻って、あなたが解決する必要がある問題を言うことができますか? 'A * p = new B();'と言っているのですか? –

+0

@phillip gcc 4.5.2は私が使用しているコンパイラです – JaySilk84

答えて

4

私は1行で

を派生クラスをインスタンス化し、基本クラスに割り当てることができるようにしたいです1行内でインスタンス化されたオブジェクト(new演算子を使用しない)は、exそれを評価するプレッシャー。だからあなたが住所を持っている時点では、一時的なものはもはや存在しません。

私は新しい演算子を使用せずに多態的な動作を取得しようとしています。

これを行うには、オブジェクトに有効な有効期間を持つ名前付き変数が必要です。

3

これは派生クラスではなく、一時変数のアドレスを取得しようとしています。スタックまたはヒープ上にオブジェクトを格納する場所を決める必要があります。

スタック:

B derived; // this works as an A any place you need it to 

ヒープ:

A* derived = new B(); 
関連する問題