在 C++ 对象中放置 int 矩阵数组时遇到问题

Posted

技术标签:

【中文标题】在 C++ 对象中放置 int 矩阵数组时遇到问题【英文标题】:Trouble placing int matrix array in a C++ Object 【发布时间】:2012-04-12 23:59:55 【问题描述】:

我需要一个变量来保存 22 对整数(网格中的位置),所以我想有一个矩阵数组。所以在我的头文件中是:

int points[22][2];

但是当我将以下内容放入对象的构造函数中时:

this->points = 1,2,2,3,...;

它说“必须是一个表达式必须是一个可修改的左值”我已经尝试使用 const 关键字并将其作为头文件中的指针,如此处所述Expression must be a modifiable L-value

我也尝试过创建一个单独的二维数组,然后分配它,但这也不起作用。

int points2 = 1,2,2,3,...;
this->points = points2;

我习惯于 Java,但我对 C++ 的经验并不多。有一个默认构造函数将按上述方式分配值,还有一个将矩阵作为参数的构造函数。

以下确实有效:

this->point[1][1] = 4;

但这意味着我不能将另一个值作为参数传递,我最终会在默认构造函数中得到 44 行凌乱的代码!我打算使用一个带有 2 个整数的结构并将它们放在一个向量中,这似乎有点矫枉过正,这意味着我需要 22 个向量插入,然后我什至用手动值调用构造函数,我只是认为必须做一个更好的方法:)

谢谢

【问题讨论】:

int points[22][2]; 不是矩阵,它是一个 C 数组,它不支持该编译器所需的初始化语义。使用a proper matrix library就不会出现这个问题了。 【参考方案1】:

由于您使用的是 C++,一个非常更好的选择是使用pairs 的pairs 的ints 的vector

这样声明:

std::vector<std::pair<int, int> > points;

在您的构造函数中,您可以在初始化时指定大小

: points(22), 

或者像这样设置它:

points.resize(22);

您可以使用

访问各个坐标
points[1].first = 1;
points[1].second = 44;

或与

points[1] = make_pair(1, 44);

或者您可以构建它而不必担心超过其分配的大小

points.push_back(make_pair(1, 44));

【讨论】:

在“this->points”处出现以下错误:指向绑定函数的指针只能用于调用函数 我不明白你在哪里得到这个错误以及你想要做什么。我建议您按照我的回答中的说明进行操作。 在标题中我有:“vector> places(22);”在对象的构造函数中,我有“this->points[0].first = 1;”据我所知,它是一样的。旁边的“->”和点是 Visual Studio 中的下划线。感谢您的帮助 显然,您应该决定是否希望将您的向量称为placespoints 那么别忘了在构造函数中调用points.resize(22)【参考方案2】:

问题的根本原因是数组在 C++ 中不算作实值。它们在许多方面都不合标准——您刚刚遇到过其中一种。任何普通类型都可以按您的预期工作。不幸的是,对于我们这些不是语言专家的人来说,Visual Studio 抛出的错误毫无帮助。

您必须在堆栈上创建一个数组,然后手动循环并分配所有值。

【讨论】:

我不确定您所说的“真实价值”是什么意思。是的,它们是“真实的”,它们的行为是明确定义的。当然不能分配给。 OP 可以像他一样声明数组并在循环中对其进行初始化,或者维护一个指针(当然,vector 会更好)。您也不能分配给文字1,它不是“真正的价值”吗?右值和左值定义得很好。 @EdS。除了在左值上下文中使用时,所有其他类型都不是右值。数组不符合与其他所有类型相同的规则。

以上是关于在 C++ 对象中放置 int 矩阵数组时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

C++ 为啥在向量段错误中放置对象?

在 C++ 中的可变长度函数中放置默认值参数的位置?

用于在世界中放置对象时的光线投射抖动

如何使用 C++ 模板实现 int、string、float 和 date 对象的数组?

在指针声明中放置星号

c++ - 将 8 个位置的 int 数组转换为 char