我正在尝试在多态项上调用函数。但是我在编译时收到以下错误消息:
成员函数'this
'的'
select
'自变量类型为'const SelectParam
',但函数未标记为const
该错误显示在p-> selection(* it)
std::set<Tuple>::iterator it;
for (it = tuples.begin(); it != tuples.end();) {
for (const SelectParam* p: selectionParams) {
bool successful = p->select(*it);
if( !successful ) {
it = tuples.erase(it);
} else {
it++;
}
}
}
,这是定义这些类的方式。 (我以前并没有所有的const和&,但我将它们放在任何地方都希望可以做任何想要的const,但显然我没有正确地解决问题,因为它没有改变任何东西。
在存储在父指针处的子类之一中。
bool const select(Tuple const & tup) {
bool matched = false;
if (tup[idx] == val) {
matched = true;
}
return matched;
}
在另一个用于多态的子类中
bool const select(Tuple const & tup) {
bool matched = false;
if (tup[idx1] == tup[idx2]) {
matched = true;
}
return matched;
}
最后是超级简单的父类。
class SelectParam {
public:
virtual const bool select( Tuple const & t) = 0;
};
``
Thanks in advance for being willing to help my feeble brain.
答案 0 :(得分:1)
实际上,您不能将非const
方法称为const
对象。但是,您也不能通过指针或对const
对象的引用调用非const
方法(无论所引用的对象是const
还是不是)。
这意味着:
const SelectParam* ptr = whatever();
ptr->select(someTuple);
格式错误。
在您的情况下,您已在此行上声明了一个指向const SelectParam
的指针:
for (const SelectParam* p: selectionParams) {
只需删除const
,它就可以工作了:-)
另一方面,如果select
绝不打算修改对象,则只需将其标记为const:
virtual const bool select( Tuple const & t) const = 0;
您的代码也应该工作。
答案 1 :(得分:0)
您需要明确告知编译器您的函数将不会修改任何成员:
bool const select(Tuple const & tup) const {
答案 2 :(得分:0)
声明为 const
的对象不能被 const
或 non-const
成员函数更改(构造函数和析构函数除外)。即使它是通过引用传递的。此规则有两个例外:
const
ness(抛弃 const),但通常不建议这样做。mutable
关键字声明类成员。即使将包含对象声明为 const
,也可以通过成员函数更改这些成员。可以阅读更多here:
<块引用>const 对象 - 类型为 const 限定的对象,或 const 对象的非可变子对象。此类对象不能被修改:直接尝试这样做是编译时错误,并且尝试间接这样做(例如,通过引用或指向非常量类型的指针修改 const 对象)会导致未定义的行为。>
正如其他人评论的那样,一种解决方案是在成员函数的声明和定义中向成员函数添加 const
关键字。这样,即使在 const
对象上也可以调用该函数。
this
是怎么回事?
在成员函数中,this
是指向函数在 [see] 上调用的当前对象的指针。