0

vector c_<class A * >;一部のクラスでプライベートとして宣言されたベクターがあります。このベクトルは、A のサブクラスへのポインターを保持します。たとえば、次のようになります。

some_class::func {
    c_.push_back (new A2);  // same as A1.
    c_.push_back (new A1);  //A1 is subclass : class A1 : public A;
    (c_.back()->methode1(); //returns a reference of A1's private member x_ for example 
}

私が得るエラーは次のとおりです。クラスAで定義されたそのようなメソッドはあり
ません。クラスAで宣言されていないため、クラスA1で宣言されています。私が見る方法はc_.back、ベクトル c_ の最後の要素を取得することです。これはクラス A1 へのポインターなので、次のように逆参照します。 -> ポインターが (A1) を指すクラスで methode1() を呼び出します。しかし、エラーが発生しますが、どこが間違っているのかわかりません。

4

1 に答える 1

4

AへのポインタからのみメソッドにアクセスできますAA1の要素でメソッドを呼び出すにはc_、 にキャストするA1か、設計を再考する必要があります。

A1* a1 = dynamic_cast<A1*>(c_.back());
if (a1) a1->methode1();

ベクトルはただの気晴らしです。これと同等のものがあります:

A* a = new A1();
a->methode1();  // Error, A has no methode1()

A1* a1 = dynamic_cast<A1*>(a);
if (a1) a1->methode1(); // OK, call the method only if the cast succeeded.

一般に、これらのキャストを頻繁に実行していることに気付いた場合は、良い兆候ではありません。

于 2013-11-07T14:54:52.837 に答える