如何使用 new 创建类指针数组?

问题描述 投票:0回答:2

我有点困惑。

我有这个代码:

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
做到这一点吗?

c++ pointers
2个回答
0
投票

它始终是相同的:

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.

0
投票

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;
     }
};
© www.soinside.com 2019 - 2024. All rights reserved.