【问题标题】:How to store a reference to a C-style array in a class?如何在类中存储对 C 样式数组的引用?
【发布时间】:2020-07-04 19:08:39
【问题描述】:
class Class
{
public:
    Class(array[3][3])    //the constructor
    {
      this->array = array
    }    

    array[3][3];
};    

int main()
{
    array[3][3] = {...initialization...};
    Class object(array[3][3]);
}

我想制作一个对象,它使用二维数组并对其进行修改。我知道 C 数组只是指向地址的指针,但是无论我写多少 *&[],我都无法在构造函数中传递它。

我能想到的最聪明的事情是在类中创建一个 POINTERS 数组,并通过 for 循环将每个指针分配给原始数组元素的地址,但是每次我想修改或读取main中的数组,我必须写例如*array[2][1] = 3

有什么聪明的办法吗?

【问题讨论】:

  • 您的错误是没有将数组传递给构造函数,您的错误是认为您可以使用= 复制数组。无论你多么努力,这都行不通。编写一个循环,或者使用std::copymemcpy
  • BTW 数组是数组,指针是指针。说 C 数组是指针是不正确的。 C 数组将转换为指针,但这根本不是一回事。
  • 是的。 Arrays 数组是 1970 年代问题的优雅解决方案。您希望能够用它们做很多事情,但您不能仅仅因为在 1970 年代在几乎没有内存且 CPU 时钟频率为 kHz 的计算机上做这件事会非常非常愚蠢.
  • 我不认为建议的副本是好的。虽然他们没有意识到 OP 的问题是复制数组,而不是将其传递给构造函数。
  • 可能我的问题没有正确提出。我想在对象中分配我的数组的指针,指向主函数中的数组,但我得到一个错误。我不想要任何复制或 for 循环或任何东西。我只想要一个知道它指向一个大小为 [3][3] 的数组的指针,并将其分配给另一个指针指向的地址...

标签: c++ arrays pointers reference


【解决方案1】:

如果我最终答对了问题,您可以使用对数组的引用:

struct Class {
    Class(int (&array)[3][3]) : array_(array)
    {}

    void set11(int value) {
        array_[1][1] = value;
    }

    int (&array_)[3][3];
};


int main() {
   int array[3][3]{};

   Class object(array);
   object.set11(99);

   std::cout << array[1][1];  // Prints 99
}

如果这不是您想要的,请澄清您的问题。

【讨论】:

  • 大声笑,是的!好像是这样!我会尽快尝试,但即使我看着它 - 这正是我想要的!我错过了数组引用周围括号的那一刻:)
  • @TheFinalCutBG,见The "Clockwise/Spiral Rule"。它是关于 C 的,但您也可以轻松地将其改编为 C++ 参考。
  • 会的!是的 - 我试过了,它就像一个魅力!
【解决方案2】:

下面是如何在你的类中声明一个指针,该指针可以指向 main 中的数组。

class Class
{
public:
    Class(int (*array)[3])
    {
         this->array = array;
    }
    int (*array)[3];
};


int main()
{
    int array[3][3] = { ... };
    Class object(array);
}

【讨论】:

  • @TheFinalCutBG 因为数组是二维的。
  • 似乎建议的副本比我意识到的更接近正确答案。
  • 哇...显然需要阅读更多关于二维数组的信息
  • 我将再次链接到建议的重复项,这显然是您的误解所在。
  • 当您将数组分配给指针时,您只会丢失 一个 维度。
猜你喜欢
  • 2020-08-15
  • 2017-08-14
  • 1970-01-01
  • 2021-05-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-16
  • 2012-10-01
相关资源
最近更新 更多