C++ 解引用迭代器(c+;+;)
我对返回非指针值的操作的解引用结果有问题 在这张地图上我有指向矩阵的指针C++ 解引用迭代器(c+;+;),c++,stl,C++,Stl,我对返回非指针值的操作的解引用结果有问题 在这张地图上我有指向矩阵的指针 map<string, GeneralMatrix*> matrixes; Add方法需要指针 尝试n2: itop1->second->add(*itop2->second) 结果为非指针,需要为指针 尝试n3: (*itop1->second->add(*itop2->second)) main.cpp:611:68:错误:与“运算符*”不匹配(操作数类型为“Gen
map<string, GeneralMatrix*> matrixes;
Add方法需要指针
尝试n2:
itop1->second->add(*itop2->second)
结果为非指针,需要为指针
尝试n3:
(*itop1->second->add(*itop2->second))
main.cpp:611:68:错误:与“运算符*”不匹配(操作数类型为“GeneralMatrix”)
那么如何取消结果限制?理想情况下,您可以将
矩阵更改为映射类型
或者,您可以保留一个存储矩阵的std::list
,并在列表中给出一个指向矩阵的指针
裸体指针被认为是不好的风格。指针应该告诉他们对该项的所有权状态,例如唯一\u ptr
、共享\u ptr
或弱\u ptr
。这也将负责内存管理
如果您的类表现良好,并且映射包含所拥有的指针,则可以执行以下操作:
matrixes.insert(std::make_pair(std::string("name"), new GeneralMatrix(std::move(m)));
matrixes.insert(pair<string, GeneralMatrix *>(result, &(*itop1)));
其中m
是您试图移动到地图中的矩阵
如果映射中的指针不拥有指针,您可以使用&m
插入映射的地址,但这需要您将矩阵存储在持久的位置,如上图所示的列表
编辑:
迭代器的具体问题可以这样解决:
matrixes.insert(std::make_pair(std::string("name"), new GeneralMatrix(std::move(m)));
matrixes.insert(pair<string, GeneralMatrix *>(result, &(*itop1)));
matrix.insert(对(结果,&(*itop1));
理想情况下,您可以将矩阵
更改为类型映射
或者,您可以保留一个存储矩阵的std::list
,并在列表中给出一个指向矩阵的指针
裸体指针被认为是不好的风格。指针应该告诉他们对该项的所有权状态,例如唯一\u ptr
、共享\u ptr
或弱\u ptr
。这也将负责内存管理
如果您的类表现良好,并且映射包含所拥有的指针,则可以执行以下操作:
matrixes.insert(std::make_pair(std::string("name"), new GeneralMatrix(std::move(m)));
matrixes.insert(pair<string, GeneralMatrix *>(result, &(*itop1)));
其中m
是您试图移动到地图中的矩阵
如果映射中的指针不拥有指针,您可以使用&m
插入映射的地址,但这需要您将矩阵存储在持久的位置,如上图所示的列表
编辑:
迭代器的具体问题可以这样解决:
matrixes.insert(std::make_pair(std::string("name"), new GeneralMatrix(std::move(m)));
matrixes.insert(pair<string, GeneralMatrix *>(result, &(*itop1)));
matrix.insert(对(结果,&(*itop1));
理想情况下,您可以将矩阵
更改为类型映射
或者,您可以保留一个存储矩阵的std::list
,并在列表中给出一个指向矩阵的指针
裸体指针被认为是不好的风格。指针应该告诉他们对该项的所有权状态,例如唯一\u ptr
、共享\u ptr
或弱\u ptr
。这也将负责内存管理
如果您的类表现良好,并且映射包含所拥有的指针,则可以执行以下操作:
matrixes.insert(std::make_pair(std::string("name"), new GeneralMatrix(std::move(m)));
matrixes.insert(pair<string, GeneralMatrix *>(result, &(*itop1)));
其中m
是您试图移动到地图中的矩阵
如果映射中的指针不拥有指针,您可以使用&m
插入映射的地址,但这需要您将矩阵存储在持久的位置,如上图所示的列表
编辑:
迭代器的具体问题可以这样解决:
matrixes.insert(std::make_pair(std::string("name"), new GeneralMatrix(std::move(m)));
matrixes.insert(pair<string, GeneralMatrix *>(result, &(*itop1)));
matrix.insert(对(结果,&(*itop1));
理想情况下,您可以将矩阵
更改为类型映射
或者,您可以保留一个存储矩阵的std::list
,并在列表中给出一个指向矩阵的指针
裸体指针被认为是不好的风格。指针应该告诉他们对该项的所有权状态,例如唯一\u ptr
、共享\u ptr
或弱\u ptr
。这也将负责内存管理
如果您的类表现良好,并且映射包含所拥有的指针,则可以执行以下操作:
matrixes.insert(std::make_pair(std::string("name"), new GeneralMatrix(std::move(m)));
matrixes.insert(pair<string, GeneralMatrix *>(result, &(*itop1)));
其中m
是您试图移动到地图中的矩阵
如果映射中的指针不拥有指针,您可以使用&m
插入映射的地址,但这需要您将矩阵存储在持久的位置,如上图所示的列表
编辑:
迭代器的具体问题可以这样解决:
matrixes.insert(std::make_pair(std::string("name"), new GeneralMatrix(std::move(m)));
matrixes.insert(pair<string, GeneralMatrix *>(result, &(*itop1)));
matrix.insert(对(结果,&(*itop1));
您的问题的快速解决方案是:
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));
将插入一个空指针
但是,您的代码有几个问题:
首先,为什么需要从createNew方法返回引用?
只需向新矩阵返回一个值。你这样做不会有任何收获
GeneralMatrix createNew(width, m2.height);
正如另一个答案中所建议的,将字符串映射到唯一的_指针,而不是使用原始指针和/或利用移动语义。
在您的例子中,由于“add”操作总是会导致创建一个新的矩阵,所以我甚至不需要处理指针,因为它们没有给您带来真正的优势
在这里,您可以找到一些适合您需要的精简代码:
std::map<std::string, GeneralMatrix> matrixes;
GeneralMatrix add(const GeneralMatrix& m2)
{
//Create new empty matrix
auto m3 = createNew(width, m2.height);
return m3;
}
如果需要多态性,只需使用返回基本std::unique\u ptr的工厂方法
std::unique_ptr<GeneralMatrix> createNew(width, m2.height);
std::unique_ptr createNew(宽度,m2.高度);
您的问题的快速解决方案是:
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));
将插入一个空指针
但是,您的代码有几个问题:
首先,为什么需要从createNew方法返回引用?
只需向新矩阵返回一个值。你这样做不会有任何收获
GeneralMatrix createNew(width, m2.height);
正如另一个答案中所建议的,将字符串映射到唯一的_指针,而不是使用原始指针和/或利用移动语义。
在您的例子中,由于“add”操作总是会导致创建一个新的矩阵,所以我甚至不需要处理指针,因为它们没有给您带来真正的优势
在这里你可以找到一些