指向对象和初始化成员值的指针数组

时间:2017-09-19 19:12:00

标签: c++ arrays pointers

我正在尝试为数组的每个条目分配内存,并将成员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 ++的新手,我正在努力理解基本概念。提前谢谢!

4 个答案:

答案 0 :(得分:3)

这是使用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; 
}

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

答案 1 :(得分:1)

在c ++中,您的示例最好有一个初始化数据的默认构造函数和一个std::vector来保存自定义类的对象。 这将为您节省大量的内存处理问题。

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


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

答案 2 :(得分:0)

您创建了10个指向Two实例的指针,但这些指针并未初始化,也没有指向任何实例。

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

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

}

答案 3 :(得分:-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; 
}