【问题标题】:How to initialize array later when using private object variable (after initializing the object)使用私有对象变量时如何稍后初始化数组(初始化对象后)
【发布时间】:2019-08-28 06:25:13
【问题描述】:

我想在创建对象时首先初始化“虚拟”数组。我在课堂上的私人部分有这个。

// Initialize dummy array when object is initialized.
int* matrix_[0][0];

然后我想稍后初始化新数组以替换虚拟数组(具有实际大小的数组)。我在我的课堂上有这样的方法:

void set_map_size(int width, int height) {
    int* pm[width][height];
    matrix_ = pm;
}

所以问题是当我在创建对象后尝试初始化这个数组时。我希望其他方法/其他对象能够访问这个数组。

也许我应该有指针?在创建对象时将指针初始化为nullptr,然后将指针更改为指向数组?

【问题讨论】:

  • int* matrix_[0][0]; 看起来不对,这是标准吗?您不应该在该函数中使用mallocnew 而不是本地自动变量吗?为了避免所有这些,如果可以的话,考虑使用std::vector
  • 它可能不起作用。我只是想说明我想要实现的目标。 @Ayxan
  • @Ayxan int* matrix_[0][0] 不对,它声明了一个长度为 0 的二维指针数组。但是 malloc 几乎不应该在 c++ 中使用,并且 raw new 很少有位置。
  • 我想有一些有占位符的东西,这样当我知道大小时,我可以用实际的二维数组替换它。在初始化对象时,我还不知道要使用的数组的大小。
  • 如果我是你,我会保持简单,并接受@Ayxan 的使用 std::vector 的建议。

标签: c++ arrays oop multidimensional-array


【解决方案1】:

在 C++ 中正确的做法是使用向量。

vector<vector<int>> matrix_;  

然后您可以动态调整矩阵的大小

void set_map_size(int width, int height) {
    matrix_.resize(height); 
    for (auto &x : matrix_) 
       x.resize(width);
}

因为数组是固定大小的,而可变长度数组不是标准的 C++(即使某些编译器接受它)。

【讨论】:

  • 问题是,每当您需要 C++ 中的某种变量数组时,答案总是std::vector
  • @George Vectors have very similar performance 并且处理动态分配的数组已经够痛苦了,除非您绝对需要在高性能库代码中获得无限小的性能提升,否则您应该使用 std::vector跨度>
  • @George 如果性能受到威胁,则应将二维向量展平为一维向量。这可能会产生重大影响。如果仍然出现性能问题,您仍然可以在时间关键部分使用指向data() 的指针。但只有在性能问题确实通过测量得到证实时才这样做,因为“过早的优化是万恶之源
猜你喜欢
  • 2013-04-05
  • 1970-01-01
  • 2013-06-27
  • 2013-07-04
  • 1970-01-01
  • 2018-06-22
  • 1970-01-01
  • 2017-02-16
相关资源
最近更新 更多