我有一个类,其中通过引用获取某个成员涉及逻辑,因此我为其创建了一个私有的getter函数,该函数在内部运行良好。
我还想提供对同一参考的公开访问,但要使用常量修饰符。 由于公共函数不应修改类的状态,因此可以使用const关键字进行声明。 但是,内部逻辑由于设计上提供了对内部成员的引用,因此不应将其声明为const。
我如何能够使用相同的逻辑来获取引用,并为其提供const和非const访问点?
我这里缺少一种模式吗?
下面我整理了一个小例子来演示:
class my_class{
public:
const int& get_my_field() const{
return get_my_field_ref(); //g++: error: error - passing 'const my_class' as 'this' argument discards qualifiers [-fpermissive]
}
private:
int field;
int& get_my_field_ref(){ //g++: warning: note - in call to 'int& my_class::get_my_field_ref()'
/* ..complex logic to get reference.. */
return field;
}
};
答案 0 :(得分:0)
某些人只要知道这些警告,就可以这样做:
int& get_my_field_ref(){'
/* ..complex logic to get reference.. */
return field;
}
const int& get_my_field_ref() const {
return const_cast<my_class&>(*this).get_my_field_ref();
}
请注意,尽管const
成员函数或多或少保证了它可以在不引起数据争用的情况下使用(也就是它是线程安全的)。您应该将complex logic
实现为线程安全的。
此外,请确保永远不要在已定义const
的对象上调用函数。 (const
只要可以追溯到非常量对象,就可以使用引用和指针。)
答案 1 :(得分:0)
经过深思熟虑,问题主要出在设计上。
示例程序未能提及的是“复杂逻辑”是要在数组内获取索引。因此,考虑到此信息,可以将计算索引的逻辑分开,并在const接口和非const接口中使用。
#include <iostream>
using namespace std;
class my_class{
public:
const int& get_my_field() const{
return field[complex_logic_to_get_reference()];
}
private:
int field[5];
int complex_logic_to_get_reference() const{
int result_index = 0;
/* Complex logic to get reference */
return result_index;
}
int& get_my_field_ref(int index){
return field[complex_logic_to_get_reference()];
}
};
int main(int argc, char *argv[])
{
return 0;
}
我向@ j6t和@Peter道歉,因为他们在发布问题时将这些信息遗漏了,这个概念现在才被点击。