2016-06-13 15 views
0

スーパークラスコンストラクタを呼び出して、それに直接 "MyStruct"構造体の配列を与えたいと思います。私はこれを以下に実証しようとしました。メインメソッドでは、構造体で "Foo"のインスタンスを作成していますが、これは "Bar"クラスの内部のスーパークラスコンストラクタでは機能しません。どのようにこれを正しく達成することができますか?スーパークラスコンストラクタ内の構造体配列の初期化

struct MyStruct 
{ 
    int x; 
    int y; 
}; 

class Foo 
{ 
private: 
    MyStruct* m_MyStructArray; 
    int m_MyStructLength; 
public: 
    Foo(MyStruct* myStructArray, int myStructLength) 
     : m_MyStructArray(myStructArray), m_MyStructLength(myStructLength) {} 
    ~Foo() {} 
    const MyStruct* getMyStructArray() { return m_MyStructArray; } 
    int getCount() { return m_MyStructLength; } 
}; 

class Bar : Foo 
{ 
public: 
    Bar() 
     : Foo((MyStruct*) { {10, 10}, { 10, 10 } }, 2) {} //This doesn't work obviously 
    ~Bar() {} 
}; 


int main() { 
    MyStruct myStructs[] = { 
      { 10, 10 }, 
      { 20, 20 }, 
    }; 
    Foo foo(myStructs, 2); 
} 
+0

おそらく、静的配列を作成し、そのポインタを 'Foo'に転送する必要があります。 – vu1p3n0x

+1

'm_MyStructArray'は配列ではなくポインタであると考えてください。 – juanchopanza

+0

@ vu1p3n0xええと...はい、それについても考えましたが、あまり優雅ではありません。別の解決策がない場合は、私はそうするでしょう。 – wuppie367

答えて

3

通常そうであるように、問題は古くなった言語構造の使用にあります。どのようにすればいいですか。

#include <vector> 
struct MyStruct 
{ 
    int x; 
    int y; 
}; 

class Foo 
{ 
private: 
    std::vector<MyStruct> m_MyStructArray; 
public: 

    Foo(const std::vector<MyStruct> myStructArray) 
     : m_MyStructArray(std::move(myStructArray)) {} 
    ~Foo() = default; 
    const auto& getMyStructArray() const { return m_MyStructArray; } 
    auto getCount() const { m_MyStructArray.size(); } 
}; 

class Bar : Foo 
{ 
public: 
    Bar() 
     : Foo({ {10, 10}, { 10, 10 } }) {} //This does work 
    ~Bar() = default; 
}; 


int main() { 
    Foo foo({{ 10, 10}, {20, 20 }}); 
} 
1

あなたのパスから離れていくことを強くお勧めします。呼び出し関数から渡された配列へのポインタを格納することには、多くの落とし穴があります。 std::vector(サイズが動的な場合)またはstd::array(サイズが静的な場合)を使用して開始してください。

class Foo 
{ 
    private: 
    std::vector<MyStruct> m_MyStructArray; 
    // No need for the additional member variable to 
    // store the size of the array. std::vector already 
    // does that. 

    public: 

    Foo(std::vector<MyStruct> const& myStructArray) : m_MyStructArray(myStructArray){} 

    ... 

}; 

その後、Barのコンストラクタは、あなたが、アレイに使用する望んでいた形の構文を使用することができます。あなたは、基本クラスのコンストラクタに渡すことができる配列へのポインタを返すためにBarのメンバーfuncionを使用することができます

...あなたはポインタを格納しなければならない場合は、と述べた

class Bar : Foo 
{ 
    public: 
    Bar() : Foo({ {10, 10}, {10, 10} }) {} 
    ~Bar() {} 
}; 

class Bar : Foo 
{ 
    public: 
    Bar() : Foo(getMyStructArray(), 2) {} 
    ~Bar() {} 

private: 

    static MyStruct* getMyStructArray() 
    { 
    static MyStruct myStructs[] = { { 10, 10 }, { 10, 10 }}; 
    return myStructs; 
    } 
}; 
+0

私の答えの大部分がコピーされているような気がしますか? – SergeyA

+0

@SergeyA、そうです。この特定のケースでは、我々は同様に考えました。 –