Return 来自非常量函数的常量引用 return 引用值
Return constant reference from non-const function return reference value
我有一个class,其中通过引用获取某个成员涉及一个逻辑,所以我为它创建了一个私有getter函数,它在内部运行良好。
我还想提供 public 对同一引用的访问权限,但要使用常量修饰符。
由于 public 函数不应修改 class 的状态,因此使用 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;
}
};
有些人你可以这样做,只要你知道注意事项:
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
成员函数或多或少地保证了它可以在不引起数据竞争的情况下使用(a.k.a。它是线程安全的)。您应该将 complex logic
实现为线程安全的。
此外,请确保永远不要对已定义的对象调用您的函数 const
。 (const
引用和指针是可以的,只要它们追溯到一个非常量对象。)
想通了,问题多出在设计上。
示例程序没有提到的是 "complex logic" 是获取数组内的索引。因此,考虑到这些信息,可以分离计算索引的逻辑,并在 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 在发布问题时遗漏了这些信息,我深表歉意,这个概念现在真的很流行。
我有一个class,其中通过引用获取某个成员涉及一个逻辑,所以我为它创建了一个私有getter函数,它在内部运行良好。
我还想提供 public 对同一引用的访问权限,但要使用常量修饰符。 由于 public 函数不应修改 class 的状态,因此使用 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;
}
};
有些人你可以这样做,只要你知道注意事项:
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
成员函数或多或少地保证了它可以在不引起数据竞争的情况下使用(a.k.a。它是线程安全的)。您应该将 complex logic
实现为线程安全的。
此外,请确保永远不要对已定义的对象调用您的函数 const
。 (const
引用和指针是可以的,只要它们追溯到一个非常量对象。)
想通了,问题多出在设计上。
示例程序没有提到的是 "complex logic" 是获取数组内的索引。因此,考虑到这些信息,可以分离计算索引的逻辑,并在 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 在发布问题时遗漏了这些信息,我深表歉意,这个概念现在真的很流行。