C++ 设计两个等价的成员函数,分别返回指向成员的常量和非常量指针
我有一个类C++ 设计两个等价的成员函数,分别返回指向成员的常量和非常量指针,c++,pointers,constants,overloading,member-functions,C++,Pointers,Constants,Overloading,Member Functions,我有一个类a和一个成员函数f,它返回指向 实例的某些内容 int* A::f() { // common code ... return &(this->some_container[some_index]) } 现在,我需要一个模拟函数,它只返回一个const指针, i、 e 请注意,由于“冗长代码”不会更改A的实例, 这也使得函数constw.r.t.成为实例(第二个 const语句) 我的问题:现在我想知道是否有一些解决方案可以避免该代码 加倍,不使用第三个函数 一
a
和一个成员函数f
,它返回指向
实例的某些内容
int* A::f() {
// common code ...
return &(this->some_container[some_index])
}
现在,我需要一个模拟函数,它只返回一个const
指针,
i、 e
请注意,由于“冗长代码”不会更改A
的实例,
这也使得函数const
w.r.t.成为实例(第二个
const
语句)
我的问题:现在我想知道是否有一些解决方案可以避免该代码
加倍,不使用第三个函数
一方面,在f_const
内部调用f
是非法的,因为f
不是
const
w.r.t.拥有的实例。另一方面,调用f_const
内部f
需要将const
指针转换为非const
指针,这也是不可能的
是否有任何优雅的声明方法,以避免代码加倍
如前所述,使用第三个函数,其公共功能为f
和
f_const
在这里不是一个选项,因为当应用于大量
函数,这会降低代码的可读性。我想假定答案可能取决于特定的上下文(例如函数的长度代码、返回的类型等) 总的来说,根据我的经验,最实用的解决方案,即使可能有点难看,也是最好的 只是为了实现const方法,并通过在non-const-other方法中的转换获得它。比如:
const int* A::f_const() const {
return &(this->some_container[some_index]);
}
int* A::f() {
return const_cast<int*>(f_const());
}
const int*A::f_const()const{
return&(this->some_容器[some_索引]);
}
int*A::f(){
返回常量cast(f_const());
}
这通常是安全的,因为您是类本身的设计者。可能重复您为什么要这样做?一个人永远不会对一个人所遇到的无穷无尽的C++问题感到惊奇。斯特劳斯特鲁普博士从未打算把他的“语言”的“恶作剧”(只要问问他)作为琐碎的哲学争论的基础,这些争论是关于什么机制的副作用会导致如此出人意料的或未预料到的语义。当然,您可以将数据复制到一个静态标量并返回其地址,地址应该保持不变:-)谢谢您的建设性回答。似乎
f_const
的实现遗漏了一个成员。它应该是this->f_const()
还是this
也需要以某种方式铸造?@flonk对不起,我不明白你的意思。请你再解释一遍好吗?对不起,我无法表达一些毫无意义的东西,你的回答很好:)
const int* A::f_const() const {
return &(this->some_container[some_index]);
}
int* A::f() {
return const_cast<int*>(f_const());
}