gpt4 book ai didi

c++ - 覆盖子类中的数组大小

转载 作者:太空狗 更新时间:2023-10-29 23:25:38 24 4
gpt4 key购买 nike

我有一个数组作为类的成员。在一个子类中,我想重新定义一个不同大小的数组。我想这样做是因为我预计会创建许多子类,每个子类只有它需要的数组大小,仅此而已。

class Foo
{
Foo() {ivar = 1};
int thisArray[2];
int ivar;
}

class Bar : public Foo
{
Bar() {ivar = 3};
int thisArray[4];
}

int main()
{
Foo myFoo;
Bar myBar;

Foo fooCollection[] = {myFoo,myBar};

cout << "myFoo array size = " << sizeof(myFoo.thisArray)/sizeof(int) << endl;
cout << "myBar array size = " << sizeof(myBar.thisArray)/sizeof(int) << endl;

for (int n=0;n<2;n++)
{
cout << "fooCollection[" << n << "] array size = ";
cout << sizeof(fooCollection[n].thisArray)/sizeof(int) << endl;
}
for (int n=0;n<2;n++)
{
cout << "fooCollection[" << n << "] ivar = ";
cout << fooCollection[n].ivar << endl;
}

}

我的结果是:

myFoo array size = 2
myBar array size = 4
fooCollection[0] array size = 2
fooCollection[1] array size = 2
fooCollection[0] ivar = 1
fooCollection[1] ivar = 3

我明白了,因为我将数组对象声明为类 Foo 的对象, 指的是 myBar在该范围内将引用 myBar就好像它是一个 Foo并因此解释 thisArray 的大小相当于2。我也明白为什么ivar结果是这样的。

有没有办法影响thisArray的大小?在 Bar 内类,以便可以在 Foo 的数组中识别其“正确”大小对象?我会使用 vector ,但它们在 arduino 平台上并不友好。我也可以简单地在 Foo 类中创建大小为 100 的数组,但我试图注意内存分配。

最佳答案

你可以模板化你的基类:

template <size_t Size>
class FooBase
{
// etc....
int thisArray[Size];
};

class Foo : public FooBase<2> { ... };

class Bar : public FooBase<4> { ... };

当然,这仅适用于一切都源自 FooBase 的情况-- 也就是说,您没有派生自 Bar 的类这需要不同的数组大小。

此外,正如评论中所说,如果您需要将它们保存在数组中,则需要存储指针。

Foo myFoo;
Bar myBar;
Foo * fooCollection[] = { &myFoo, &myBar };

哎呀,我假设Bar源自 Foo ,它不再这样做了。如果你想要一个没有模板化的公共(public)基础,你需要派生模板化类 FooBase<Size>来自另一个基地FooType现在使用 FooType 的数组.我认为这会奏效。

class FooType {
public:
// etc...
virtual size_t GetSize() const = 0;
};

template <size_t Size>
class FooBase : public FooType
{
public:
// etc...
virtual size_t GetSize() const { return Size; }

protected:
// etc....
int thisArray[Size];
};

然后:

FooType *fooCollection[] = { &myFoo, &myBar };

关于c++ - 覆盖子类中的数组大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14447192/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com