指针的数组要分类对象和初始化成员值

Array of Pointers to class objects and initializing member values

本文关键字:初始化 成员 对象 分类 数组 指针      更新时间:2023-10-16

我正在尝试为数组的每个条目分配内存,并初始化成员part1和part2至0。

#include <iostream>
using namespace std;
class Two {
public:
    int part1;
    int part2;
};

int main() {
    Two * dp[10]; //array of 10 pointers to objects of class Two
    part1 = 0;
    part2 = 0;
    for (int i = 0; i < 10; i++) { 
        dp[i] = 0;                        
    }
    return 0; 
}

任何帮助将不胜感激。我是C 的新手,我正在尝试理解基本概念。预先感谢您!

这是该代码的真正基本版本,该版本使用new分配内存:

#include <iostream>
class Two {
public:
  Two() : part1(0), part2(0) { };
  int part1;
  int part2;
};

int main() {
  const size_t count = 10;
  Two *dp = new Two[count];
  // Do stuff?
  for (size_t i = 0; i < count; ++i) {
    std::cout << dp[i].part1 << "/" << dp[i].part2 << std::endl;
  }
  delete[] dp;
  return 0; 
}

请注意,出于多种原因,这是一个坏主意,但是如果您需要辅助标准库,因为老师,这就是您去的地方。

在您的示例中,最好使用默认的构造函数来初始化数据和std::vector来保存自定义类的对象。这将为您节省很多内存处理问题。

class Two {
public:
  Two() : part1(0), part2(0) { };
  int part1;
  int part2;
};

int main() {
    std::vector<Two> twoVec(10);
    return 0; 
}

您为Two的实例创建了10个指针,但是这些指针并不活化,也不指向任何实例。

这是创建这些实例,将指针存储在数组中的一种方法,然后将其part1成员设置为1,将part2成员设置为2;

for (int i = 0; i < 10; i++) { 
    dp[i] = new Two();
    dp[i]->part1= 1;              
    dp[i]->part2= 2;              
}

您需要分配由数组的元素指向的类型class Two的对象。否则该程序将具有不确定的行为。

您可以使用标准算法std::generate进行此操作

#include <iterator>
#include <algorithm>
//...
Two * dp[10]; //array of 10 pointers to objects of class Two
std::generate( std::begin( dp ), std::end( dp ), 
               [] { return new Two { 0, 0 };} );    

或者您可以将范围用于循环。例如

Two * dp[10]; //array of 10 pointers to objects of class Two
for ( Two * &p : dp ) p = new Two { 0, 0 }; 

这是一个指示的程序

#include <iostream>
using namespace std;
class Two {
public:
    int part1;
    int part2;
};

int main() 
{
    Two * dp[10]; //array of 10 pointers to objects of class Two
    for ( Two * &p : dp ) p = new Two { 0, 0 }; 
    // processing of the array
    for ( Two * &p : dp ) 
    {
        delete p;
        p = nullptr;
    }       
    return 0; 
}