我在解除引用返回非指针值的操作结果时遇到问题。
在这张地图中,我有指向矩阵的指针
map<string, GeneralMatrix*> matrixes;
这就是矩阵运算的样子
GeneralMatrix & add(const GeneralMatrix & m2) {
//Check for compatible matrixes
if (height != m2.height || width != m2.width) {
cout << "Matrix sizes must match!" << endl;
return *this;
}
//Create new empty matrix
GeneralMatrix &m3 = createNew(width, m2.height);
//Set every number to sum of this and given matrix
for (int i = 0; i < height; i++) {
for (int j = 0; j < m2.width; j++) {
double val = m2.get(i, j);
if (val != 0) {
val += get(i, j);
m3.set(i, j, val);
}
}
}
return m3;
}
如您所见,add方法返回我想插入地图的非指针矩阵。
这就是我的尝试:
map<string, GeneralMatrix *>::iterator itop1 , itop2;
//now seting iterators to their position
//there is the problem
matrixes.insert(pair<string, GeneralMatrix *>(result, (*itop1->second->add(*itop2->second))));
问题是我无法找到如何插入对的第二个参数。由于类型不同,它总是以错误结束。
尝试n1:
itop1->second->add(itop2->second)
添加方法需要指针
尝试n2:
itop1->second->add(*itop2->second)
结果是非指针,需要是指针
尝试n3:
(*itop1->second->add(*itop2->second))
main.cpp:611:68:错误:'operator *'不匹配(操作数类型为'GeneralMatrix')
如何去除结果?
答案 0 :(得分:2)
理想情况下,您可以将matrixes
更改为map<string, GeneralMatrix>
。
或者,您可以保留一个存储矩阵的std::list<GeneralMatrix>
,并指定列表中的矩阵。
裸指针被认为是不好的风格。指针应该告诉他们对项目的所有权状态,例如unique_ptr
,shared_ptr
或weak_ptr
。这也将照顾内存管理。
如果你的班级表现良好且地图拥有指针,你可以这样做:
matrixes.insert(std::make_pair(std::string("name"), new GeneralMatrix(std::move(m)));
m
是您尝试移动到地图中的矩阵。
如果地图中的指针不拥有指针,您只需使用&m
插入地图的地址,但这需要您将矩阵存储在某个持久性位置,例如上面显示的list
编辑: 迭代器的具体问题可以这样解决:
matrixes.insert(pair<string, GeneralMatrix *>(result, &(*itop1)));
答案 1 :(得分:1)
快速解决您的问题的方法是:
GeneralMatrix& m3= add(m2);
matrixes["string"] = &m3;
matrixes.insert(std::make_pair(std::string("name"), (&m3)));
matrixes.insert(std::make_pair<std::string, GeneralMatrix*>("name", &m3));
在这种情况下它们基本上都是等价的,但是operator []将始终在地图中插入一个值,即使右手操作符为空。 例如:
matrixes["s"];
将插入一个空指针
但是您的代码有几个问题:
首先,为什么需要从createNew方法返回引用? 只需将值返回到新矩阵即可。你没有做任何事情。
GeneralMatrix createNew(width, m2.height);
正如另一个答案中所建议的那样,将字符串映射到unique_pointers而不是使用原始指针和/或杠杆移动语义。 在你的情况下,由于“添加”操作总是会导致创建一个新的矩阵,我甚至不打扰处理指针,因为它们没有给你带来真正的好处
在这里,您可以找到一些符合您需求的精简代码:
std::map<std::string, GeneralMatrix> matrixes;
GeneralMatrix add(const GeneralMatrix& m2)
{
//Create new empty matrix
auto m3 = createNew(width, m2.height);
return m3;
}
另请注意,此代码将通过编译进行优化,使用名为NRVO(命名为return valueoptimization)的东西,并且它可能比您之前在createNew方法中处理动态分配的代码更快。 现在,如果通用矩阵正确实现了右值复制构造函数,则可以将其移动到地图
map.insert(std::string("string"), std::move<m3>);
或者你可以放置它(尚未由所有编译器实现)
map.emplace(std::make_pair(std::string("string"), createNew(m2)));
如果您需要多态性,只需使用返回基本std :: unique_ptr的工厂方法。
std::unique_ptr<GeneralMatrix> createNew(width, m2.height);