2016-08-07 10 views
1

構造体を親クラスで宣言し、それを継承する子クラスで定義することはできますか?私は親クラスshaderと継承したクラス(すなわちsimple_color_shader)のたくさん持っ :継承クラスで構造体を拡張する

class parent 
{ 
    virtual struct AlwaysDifferentStructure; 

    //Some methods here 
    //... 
}; 

class child1 : public parent 
{ 
    struct AlwaysDifferentStructure 
    { 
     int foo; 
    } 

    //Some methods here 
    //... 
}; 

class child2 : public parent 
{ 
    struct AlwaysDifferentStructure 
    { 
     char* foo; 
     float bar; 
     double foobar; 
    } 

    //Some methods here 
    //... 
}; 

だから、実際に私が対処んしようとしていますどのような以下の通りです:

例は次のようになります。各シェーダには独自の頂点構造があります。これらのシェーダの1つを使ってオブジェクトをレンダリングしたいのですが、頂点構造体がどのように正確に見えるかはわかりません。なぜなら、これは常に異なっているからです。だから私はすべての子どもたちに構造体を再宣言し、親を通してアクセスできると思った。だから、基本的にはこのようになりますobjectクラス:

class object 
{ 
    parent* m_pParent; 
    AlwaysDifferentStructure* m_structArray; 
}; 

(あなたは私があなたに伝えるためにしようとしているのか理解していない場合だけ頼む;私の英語は良いことではありません)

私の質問は:これも可能ですか?はいの場合、誰かが私にどのように教えてくれたら分かりますか?

+0

[XY問題](http://xyproblem.info/)のように聞こえます。もしあなたがそのような施設を持っていたら、それは何のために使うのですか?あなたは本当に何を達成しようとしていますか? –

+0

"親からのアクセスを得る"部分を明確にすることはできますか? 'AlwaysDifferentStructure'を使用するコードはどのようなものですか?無意味な 'virtual struct AlwaysDifferentStructure;'行を削除すると、あなたが表示する例がうまくコンパイルされます。さらに役立つことを望むなら、難しい実際の使用状況を表示する必要があります。 –

+0

@IgorTandetnikは、 'new'で配列を作成し、' m_pParent'が指す子の 'struct'を返します。 – Rafiwui

答えて

0

このようなものはOPのためにCuriously recurring template pattern

template <typename derived> 
class parent 
{ 
    void someMethod() 
    { 
     typename derived::AlwaysDifferentStructure x; 

     x.foo; 
    } 
}; 

class child1 : public parent <child1> 
{ 
    struct AlwaysDifferentStructure 
    { 
     int foo; 
    } 

    //Some methods here 
    //... 
} 

class child2 : public parent <child2> 
{ 
    struct AlwaysDifferentStructure 
    { 
     char* foo; 
     float bar; 
     double foobar; 
    } 

    //Some methods here 
    //... 
} 
+0

しかし、 'child2'に' foo'がないと 'someMethod'が失敗するでしょうか? – Rafiwui

+0

@Rafiwuiはい。私は、構造のそれぞれの異なるバージョンが何か共通していると仮定します。あなたの例では、それはそれでした。 – nate

+0

悪い例sry – Rafiwui

0

で実現できますが、私は将来の読者のためにそれらをここに掲示しています、コメントで掲示スニペットは良い提案であることが判明しました。ここで


コメントで述べたように、可能なアプローチである。この第二の例が必要であることを

class parent { 
    //Some methods here 
    //... 
}; 

class child1 : public parent { 
public: 
    auto alwaysDifferentStructure() { 
     struct S { 
      int foo; 
     } s; 

     return s; 
    } 
}; 

class child2 : public parent { 
public: 
    auto alwaysDifferentStructure() { 
     struct S { 
      char* foo; 
      float bar; 
      double foobar; 
     } s; 

     return s; 
    } 
}; 

int main() { 
    auto c1t = child1{}.alwaysDifferentStructure(); 
    c1t.foo = 42; 
    auto c2t = child2{}.alwaysDifferentStructure(); 
    c2t.foo = new char{'c'}; 
    c2t.bar = .42; 
    c2t.foobar = 0.; 
} 

注:別の実行可能なソリューションとして

class parent { }; 
class child1 : public parent { }; 
class child2 : public parent { }; 

template<typename> 
struct AlwaysDifferentStructure; 

template<> 
struct AlwaysDifferentStructure<child1> { 
    int foo; 
}; 

template<> 
struct AlwaysDifferentStructure<child2> { 
    char* foo; 
    float bar; 
    double foobar; 
}; 

int main() { 
    AlwaysDifferentStructure<child1> c1t; 
    c1t.foo = 42; 
    AlwaysDifferentStructure<child2> c2t; 
    c2t.foo = new char{'c'}; 
    c2t.bar = .42; 
    c2t.foobar = 0.; 
} 

、あなたはこれを行うことができますC++ 14。

関連する問題