我想调用超类构造函数并直接给它一个“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);
}
答案 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;
}
};