1

基本クラスと派生クラスの配列を別のクラスに設定しようとしています。たとえば、私は基本クラスを持っています:

class Base{
public:
    Base() {};
    Base(float kv) : param(kv) {}
    ~Base() {};
    float getParam() { return param; }
    void setParam(bool kv) { param= kv; }
protected:
    float param;
};

および次のような派生クラス:

class Derived1: public Base{
public:
    Derived1() {};
    Derived1(float kv) : Base(kv) {}
    ~Derived1() {};
};

さて、別のクラスに Base 型の配列があります。

class Hive{
public:
    Hive() {};
    Hive(...) : ... {}
    ~Hive() {};
    ...
    float getSomethingFromArray();

    ...
    void setB();
protected:
    ...
    Base *b[7];
};

次に、setB()次のように配列をインスタンス化します。

b[0] = new Derived1();

しかし、b[0] のメソッドにアクセスしようとすると、うまくいきません。次のようなメソッドを呼び出すと:

b[0].setParam(i);

コンパイラはこのエラーを報告します

IntelliSense: 式にはクラス型が必要です c:\users\miller\documents\visual studio 2010\projects\hello\hello\objekat.h 139 2 こんにちは

4

2 に答える 2

5

しかし、b[0] のメソッドにアクセスしようとすると、うまくいきません。理由はありますか?

b[0]ですBase*Baseコンパイラは、それが指しているオブジェクトの実際の型が、Derived1またはであるかどうかを認識していません。そのため、そのオブジェクトからDerived42のみメソッドを呼び出すBaseことができます。これは、存在を保証できる唯一のものであるためです。

そこからメソッドを呼び出そうとしていると思いますDerived1

b[0] = new Derived1();
//...
b[0]->getSomethingFromArray();

ただし、コードは次のように簡単に置き換えることができることに注意してください。

b[0] = new Base();
//...
b[0]->getSomethingFromArray();

今何?これを機能させるには、キャストを使用b[0]して、必要な型にキャストできます (確実な場合)。クラスがポリモーフィックである場合はdynamic_cast、 を使用できます。これは、正しい型にキャストしていることを確認するためのチェックも行います (これを調べてください)。

または、単にポリモーフィズムを利用することもできます (特定のケースで意味がある場合のみ)。

于 2012-10-23T21:04:16.617 に答える
1

あなたの間違いは非常に単純です。ポインターを介してメソッドを呼び出すには、->ドットではなく演算子を使用する必要があり.ます。

この方法ではありません:

b[0].setParam(i);

しかし、このように:

b[0]->setParam(i);
于 2012-10-23T21:14:18.043 に答える