2016-08-16 43 views
-1

我有一个类A和一个成员函数f,即返回指向 实例的一些内容设计两个等价成员函数返回一个const和非const指针到构件,分别

int* A::f() { 
    // common code ... 
    return &(this->some_container[some_index]) 
} 

现在,我需要模拟功能,只返回一个指针const, 即

const int* A::f_const() const { 
    // exactly the same lengthy code ... 
    return &(this->some_container[some_index]); 
} 

需要注意的是,随着“冗长的代码”不改变0123实例, 这也使得功能const w.r.t.该实例(第二个 const声明)。

我的问题:现在我不知道是否有一些解决方案,以避免代码 加倍,不使用第三个功能

一方面,呼吁ff_const将是非法的,因为fconst w.r.t.拥有的实例。另一方面,在f内部调用f_const 将需要将const指针转换为非const 指针,这也是不可能的。

有没有优雅的声明方法,避免代码翻倍?

如所述,这里使用具有ff_const共同功能的第三个功能是不是一种选择,因为当施加大量 功能,它将使码的可读性。

+1

可能的重复[如何删除类似的const和非const成员函数之间的代码重复?](http://stackoverflow.com/questions/123758/how-do-i-remove-code-duplication-between -similar-const-and-non-const-member-func) – Rakete1111

+0

你为什么要这样做?人们永远不会想到人们遇到的无穷无尽的C++问题。斯特劳斯特鲁普博士从来没有打算为他的“语言”的“实际笑话”(只问他)作为一个基础来摆弄关于什么机制可能导致某些意想不到的或无用的因素的副作用的哲学论证语义。当然,您可以将数据复制到静态标量并返回其地址,该地址应该保持不变:-) –

回答

0

我想前提的答案可能取决于特定的上下文(例如函数的长度代码,返回类型等)。

一般来说,对于我的经验来说,最实用的,即使可能有点难看,解决方案是const cast operator

只是为了实现常量方法,并在非const其他方法转换得到它。例如:

const int* A::f_const() const { 
    return &(this->some_container[some_index]); 
} 

int* A::f() { 
    return const_cast<int*>(f_const()); 
} 

这通常是安全的,因为你是类本身的设计者。

+0

感谢您的建设性答案。看起来'f_const'的实现忽略了一个成员。它应该只是'this-> f_const()'还是'this'也需要以某种方式流传? – flonk

+0

@flonk对不起,我不明白你的意思。你可以试着再解释一遍吗? –

+0

对不起,我无法表达一些没有任何意义的东西,你的回答是完全正确的:) – flonk

相关问题