C++集合方法:函数'setCost'不可行:'this'参数的类型'const value_type'
C++ set method: function 'setCost' not viable: 'this' argument has type 'const value_type'
我无法通过set方法为私有成员变量设置值。获取错误
member function 'setCost' not viable: 'this' argument has type 'const value_type' (aka 'const Position'), but function is not marked const
我有以下代码:
class Position {
public:
Position();
Position(int x, int y);
int getCost() const;
void setCost (int c);
private:
int x;
int y;
int cost;
};
void Position::setCost (int c){
this->cost = c;
}
class Board{
public:
Board();
Board(int N);
void shortestPath32 (Position start, Position end);
private:
int N;
char W[32][32];
};
void Board::shortestPath32 (Position start, Position end){
/* some code here */
set <Position> validMoves = getValidPositions(parent);
for(auto child =validMoves.begin(); child!=validMoves.end(); ++child ){
/*some code here ...*/
int c = 5
(*child).setCost(c);
}
}
}
很明显,如果我将setCost声明为void Position::setCost (int c) const
,我将无法在内部执行赋值操作。此外,我研究了set方法的这个线程,但没有帮助。
这是std::set
的限制-它的迭代器总是返回const
引用。其原理是,修改集合中的元素可能会改变其位置,因此这是不允许的。
要修改集合中的元素,官方流程是将其从集合中取出、修改并插入
现在,如果您知道修改某些元素属性不会影响其位置,那么作为一种肮脏的解决方法,您可以声明这些mutable
和setterconst
:
class Position {
public:
Position();
Position(int x, int y);
int getCost() const;
void setCost (int c) const { cost = c; }
private:
int x;
int y;
mutable int cost;
};
一个更脏的解决方案是扔掉const
,然后你可以修改任何东西(即使提起这个我也觉得脏)。
第页。S.这个问题通常可以通过选择更适合您需求的结构来避免,例如std::map
;您可以将代码重构为Position
和Cost
:
class Position {
int x;
int y;
. . .
};
class Cost {
int cost;
. . .
};
std::map<Position,Cost> validMoves;
然后您可以合法修改Cost
,而Position
可以保留const
:
for(auto it =validMoves.begin(); it!=validMoves.end(); ++it){
it->second.setCost(c);
}
但这是一个设计选择,可能取决于问题中未提及的其他因素。。。
根据单据,集合中元素的值不能在容器中修改一次(元素总是常量),但可以从容器中插入或删除它们。
所以你需要擦除并重新插入到集合中。
如何更新std::set的现有元素?
正如其他人所提到的,你可以去掉const,但这不是最好的解决方案,如果你这样做了,你必须确保在排序中没有使用成本。你可以用map替换set,并将成本存储在类之外。
然后你可以做如下的事情。。。
void Board::shortestPath32 (Position start, Position end){
map<Position, int> validMoves; //getValidPositions(parent);
for(auto child=validMoves.begin(); child!=validMoves.end(); ++child ){
child->second=1; // NYI - replace 1 with the cost
}
}
相关文章:
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 视觉工作室 2017;启用 /permissive 时,类型 "const wchar_t *" 的参数与类型 "PWSTR" 的参数不兼容
- 无法使用类型 'const char *' 的左值初始化类型 'char *' 的成员子对象
- "const wchar_t *" 类型的值不能用于初始化类型 "const PWSTR" 的实体
- 错误:对类型 'const ItemInstance' 的引用无法绑定到类型 'void' 的右值
- C++ 类型 "char" 的参数与类型 "const char" 的参数不兼容
- 在这种情况下,如何从类型 "const char*" 初始化字段?
- 类型"const char[2]"的值不能隐式转换为"int"错误C++
- 错误:数组下标的类型"const bool[int]"无效
- 错误:C2679 二进制"==":未找到采用类型 'const std::string' 的右侧操作数的运算符(或者没有可接受的转换)
- 类型 "const char *" 的参数与类型 "char *" 的参数不兼容
- 错误:"->"的基本操作数具有非指针类型"const"
- 作为返回类型"const int&"做什么?
- 类型 "const char*" 的参数与类型 "char*" 的参数不兼容。但是为什么?:(
- 类型 "const char*" 的参数与类型 "Person" 的参数不兼容
- C++:"错误:类型'const char*'和'const char [28]'的操作数无效到二进制'ope
- 类型 "const char *" 的参数与类型 "LPCWSTR" 的参数不兼容
- 错误:从不兼容的类型 'const char *' 分配给'char'
- 类型 "const char *" 的默认参数与类型 "char *" 的参数不兼容
- 类型 "const char *" 的参数与 "LPSTR" C++ 类型的参数不兼容