【问题标题】:Initialization of a pointer to an array of objects初始化指向对象数组的指针
【发布时间】:2014-03-14 20:17:16
【问题描述】:

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

int main(){
   Port *ports;

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

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

错误 C4700:使用了未初始化的局部变量“端口”

【问题讨论】:

    标签: c++ class oop pointers


    【解决方案1】:

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

    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;
    

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

    【讨论】:

      【解决方案2】:

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

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

      不要忘记稍后delete数组,也许通过结束你的main

       delete[] ports;
      

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

       std::vector<Port> ports;
      

      阅读有关std::vector 的更多信息。您可能想调用它的resize 或push_back 或emplace_back 方法(假设C++11)。因此,如果您可以构造一些 Port(12,"abc");,您会调用:

       ports.emplace_back(12,"abc");
      

      在ports 向量的末尾构造和添加这样一个端口。

      【讨论】:

      • 感谢您的回复,我会考虑使用向量。
      【解决方案3】:

      错误信息很清楚:变量端口未初始化

      Port *ports;
      

      所以它有任意值。

      您需要为要使用的数组分配内存。例如

      Port *ports = new Port[M];
      

      如果使用类 std::vector 来代替动态分配的数组会更好。例如

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

      【讨论】:

        猜你喜欢
        • 2013-06-30
        • 2010-10-11
        • 1970-01-01
        • 1970-01-01
        • 2015-04-28
        • 2015-12-31
        • 1970-01-01
        • 1970-01-01
        • 2012-12-19
        相关资源
        最近更新 更多