Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 解引用迭代器(c+;+;)_C++_Stl - Fatal编程技术网

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”操作总是会导致创建一个新的矩阵,所以我甚至不需要处理指针,因为它们没有给您带来真正的优势

在这里你可以找到一些