在超类构造函数中初始化struct数组

时间:2016-06-13 20:38:07

标签: c++

我想调用超类构造函数并直接给它一个“MyStruct”结构数组。我试图在下面证明这一点。在main方法中,我正在使用结构创建一个“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);
}

2 个答案:

答案 0 :(得分: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 :(得分: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的构造函数可以使用您希望用于数组的表单的语法。

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

话虽如此,如果你必须存储指针......

您可以使用Bar的成员函数返回指向可以传递给基类构造函数的数组的指针。

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

 private:

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