在 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++,一个非常更好的选择是使用pair
s 的pair
s 的int
s 的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”处出现以下错误:指向绑定函数的指针只能用于调用函数 我不明白你在哪里得到这个错误以及你想要做什么。我建议您按照我的回答中的说明进行操作。 在标题中我有:“vectorplaces
或points
。
那么别忘了在构造函数中调用points.resize(22)
。【参考方案2】:
问题的根本原因是数组在 C++ 中不算作实值。它们在许多方面都不合标准——您刚刚遇到过其中一种。任何普通类型都可以按您的预期工作。不幸的是,对于我们这些不是语言专家的人来说,Visual Studio 抛出的错误毫无帮助。
您必须在堆栈上创建一个数组,然后手动循环并分配所有值。
【讨论】:
我不确定您所说的“真实价值”是什么意思。是的,它们是“真实的”,它们的行为是明确定义的。当然不能分配给。 OP 可以像他一样声明数组并在循环中对其进行初始化,或者维护一个指针(当然,vector
会更好)。您也不能分配给文字1
,它不是“真正的价值”吗?右值和左值定义得很好。
@EdS。除了在左值上下文中使用时,所有其他类型都不是右值。数组不符合与其他所有类型相同的规则。以上是关于在 C++ 对象中放置 int 矩阵数组时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章