1

私の問題は次のとおりです。

int main()
{
    Base* derivedobject = new Derived1();
    derivedobject->GetProperties()-> ???

return 0;
}

//********************
// BaseClass.h
//********************
struct PropertyStruct
{
    int x;
};

class Base
{
public:
    Base();
    ~Base();

    virtual PropertyStruct GetProperties() = 0;

private:
};

//********************
// DerivedClass1.h
//********************
struct PropertyStruct
{
    int y;
};

class Derived1 : public Base
{
public:
    Derived1();
    ~Derived1();

    PropertyStruct GetProperties() { return myOwnDifferentProperties; };

private:

};

//********************
// DerivedClass2.h
//********************
struct PropertyStruct
{
    float z;
};

class Derived2 : public Base
{
public:
    Derived2();
    ~Derived2();

    PropertyStruct GetProperties() { return myOwnDifferentProperties };

private:

};

そのようにすると、PropertyStruct が再定義であるというエラーが表示されます。名前空間を使用するか、派生クラス内の構造体の名前を変更すると、戻り値の型が Base で定義されたものと同じではないというエラーが表示されます。仮想関数の戻り値の型をコンパイルするポインターとして定義すると、メイン メソッド (この例では) から関数 "GetProperties" にアクセスするときの次の問題は、ベース オブジェクトが派生クラスの構造体の中にある変数を認識しないことです。 .

これを実現する方法はありますか?各派生オブジェクトのさまざまなプロパティを取得できますが、基本クラスオブジェクトを使用していますか?

4

3 に答える 3

2

他の人が述べているように、ここであなたの目標を達成する方法がありますが、最終的には次のようなコードを書くことになります。

    Base * object = ...;

    if object is Derived1 then
      get Property1 and do something with it
    else if object is Derived2 then
      get Property2 and do something with it

これは、オブジェクト指向プログラミングのアンチパターンです。さまざまな派生型間の違いを表すクラス階層がすでにあります。オブジェクトからデータを抽出して外部で処理するのではなく、仮想関数を基本クラスに追加して、派生クラスに処理を任せることを検討してください。

class Base
{
public:

    virtual void DoSomething() = 0;
};

class Derived1 : Base
{
public:

    void DoSomething()
    {
        // use myOwnDifferentProperties as necessary
    }

private:

    PropertyStruct myOwnDifferentProperties;
};

必要な処理を派生クラスに配置することが適切でない場合(つまり、不要な責任が発生する場合)、階層の機能を拡張する方法としてビジターパターンを検討することをお勧めします。

于 2012-07-26T16:14:30.660 に答える
0

テンプレートクラスを使用してそれを行うことができます:

struct PropertyStruct1 {
    float f;
};

struct PropertyStruct2 {
    int i;
};

template<class T>
class A{
public:
    T GetProperties() {return mProps;}

private:
    T mProps;   
};

int main (int argc, const char * argv[]) {

    A<PropertyStruct1> a1;
    int f = a1.GetProperties().f;
    A<PropertyStruct2> a2;
    int i = a2.GetProperties().i;
    return 0;
}
于 2012-07-26T15:55:52.013 に答える