2

私の両方のクラス: 親と子は (今のところ) 同じで、同じコンストラクターを持っています。

class Parent{
protected:
  string name;
public:
  Parent(string &n, vector <int> &v) {
  /* read n and v into vars */
};

class Child : public Parent {
public:
  Child(string &n, vector <int> &v) : Parent(n, v) {}
};
vector <int> val;
string nam, numb;
if(val[0] == 0) 
  Child* ptr = new Child(nam, val);
else
  Parent* ptr = new Parent(nam, val);

myMap.insert(Maptype::value_type(numb, ptr) );

Child* ptr オブジェクトを Parent* ptr オブジェクトとして渡すことは合法ですか? ポインターの型が同じと聞いたので、大丈夫なはずです。次に、なぜ警告が表示されるのですか: 未使用の変数 'ptr' 警告: 未使用の変数 'ptr' エラー: 'ptr' はこのスコープで宣言されていませんか? 私のプログラムは、親クラスのみで正常に動作します。親権を継承していないように感じます。

4

2 に答える 2

6

ptrこのコードは、スコープが非常に限定された、と呼ばれる2つの別個の変数を作成します。

次のことを考慮してください。

if(val[0] == 0) 
  Child* ptr = new Child(nam, val);
else
  Parent* ptr = new Parent(nam, val);

これは次と同等です。

if(val[0] == 0) {
  Child* ptr = new Child(nam, val);
} else {
  Parent* ptr = new Parent(nam, val);
}
// neither of the `ptr' variables is in scope here

コードを修正する1つの方法は次のとおりです。

Parent* ptr;
if(val[0] == 0) 
  ptr = new Child(nam, val);
else
  ptr = new Parent(nam, val);

これを行ったらParent、仮想デストラクタがあることも確認する必要があります。仮想デストラクタをいつ使用するかを参照してください。

于 2012-06-10T08:25:14.200 に答える
-1

ifステートメントでのみptrを宣言するため、ifステートメントのすぐ上で宣言してみて、aix answerのようにすることができます

于 2012-06-10T11:21:22.407 に答える