我有点困惑。
我有这个代码:
class Fish {
public:
void Swim()
{
std::cout << "I'm Swiming" << std::endl;
}
};
现在,在另一个类中,我想对此类的数组进行聚合:
class Pool {
Fish ** fishes;
public:
Pool(int p_fishes)
{
fishes = new Fish[p_fishes]
}
~Pool()
{
delete[] fishes
}
};
我真正想做的是创建一个
Fish*
数组,而不是像这样进行硬编码:
Fish* fishes[8];
有什么方法可以用
new
做到这一点吗?
它始终是相同的:
new T[N]
动态分配N
类型的T
元素数组。使用成员初始值设定项列表,您可以执行以下操作:
Pool(int p_fishes) : fishes(new Fish * [p_fishes])
{}
但是,这会让你的
Pool
a)相当无聊,因为它不包含任何鱼,它只包含指针。 b) 坏了,因为它不遵循 3 的规则,复制它会让你到达共享相同指针数组的Pool
(但仍然没有鱼)。
如果您希望
Pool
成为“此类数组的聚合”,请使用 std::vector
:
#include <iostream>
#include <vector>
class Fish {
public:
void Swim()
{
std::cout << "I'm Swiming" << std::endl;
}
};
class Pool {
std::vector<Fish> fishes;
public:
Pool(int p_fishes) : fishes(p_fishes)
{
std::cout << "I am a pool with " << fishes.size() << " default constructed fishes.\n";
}
};
int main() {
Pool p(42);
}
输出:
I am a pool with 42 default constructed fishes.
Fish* fishes[8];
是Fish*
指针的数组。 new Fish[...]
是 Fish
对象的数组。 new T[]
返回 T*
,在本例中 T
是 Fish
,并且您不能将 Fish*
分配给 Fish**
。
如果你确实想要一个指针数组,你需要使用
new Fish*[...]
代替,例如:
class Pool {
Fish ** fishes;
int num_fishes;
public:
Pool(int p_fishes)
{
num_fishes = p_fishes;
fishes = new Fish*[p_fishes];
for(int i = 0; i < p_fishes; ++i) {
fishes[i] = new Fish;
}
}
~Pool()
{
for(int i = 0; i < num_fishes; ++i) {
delete fishes[i];
}
delete[] fishes;
}
};