初始化指向对象数组的指针

时间:2014-02-15 11:25:11

标签: c++ class oop pointers

我打算初始化一个指向“Port.h”类对象数组的指针。为此,首先初始化一个类型为“Port”的指针,然后为该数组的每个元素调用该类的构造函数。

int main(){
   Port *ports;

   for (int m = 0; m < M; m++){
       // Initialize
       ports[m] = Port(***PARAMETERS***);
       // ...
   }
   // ...
}

运行代码时出现以下错误:

错误C4700:未初始化的本地变量'ports'已使用

3 个答案:

答案 0 :(得分:2)

在开始将指针加载到数组之前,需要初始化数组本身:

Port *ports = new Port[M];

但是,您的类缺少默认构造函数,因此上述声明将不起作用。您可以改为创建一个指针数组,并像这样使用它:

Port **ports = new Port*[M];

将数据放入指针数组时,需要使用运算符new

ports[m] = new Port(***PARAMETERS***);
//         ^^^

由于ports现在拥有指针,因此您需要使用指针语法来访问Port的成员:

ports[m]->memberFunction(param1, param2); // Note the use of '->' in place of a dot '.'

使用完阵列后,需要delete各个Port个对象,然后delete[] ports数组以避免内存泄漏:

for (int m = 0 ; m != M ; m++) {
    delete ports[m];
}
delete[] ports;

注意:现在有很多代码专门用于管理内存。为避免编写此代码,请使用标准集合和智能指针。

答案 1 :(得分:1)

至少,你应该为该指针分配一个区域:

 #define M 15 /* or whatever you want */
 Port *ports = new Port[M];

请稍后忘记delete数组,或许可以使用

结束main
 delete[] ports;

但我相信你不应该使用指向数组区域的指针,而应该使用向量,例如

 std::vector<Port> ports;

详细了解std::vector。您可能想要调用其resize或其push_backemplace_back方法(假设C++11)。因此,如果您可以构建一些Port(12,"abc");,您可以调用:

 ports.emplace_back(12,"abc");

ports向量的末尾构建并添加此类端口。

答案 2 :(得分:1)

错误消息足够清楚:变量端口未初始化

Port *ports;

所以它有任意价值。

您需要为要使用的阵列分配内存。例如

Port *ports = new Port[M];

如果不使用动态分配的数组,你会使用类std :: vector会更好。例如

std::vector<Port> ports( M, Port(***PARAMETERS***) );