【发布时间】:2012-03-11 20:08:22
【问题描述】:
这是一组实现了一种适配器模式的 C++ 类:
#include <iostream>
class Cfoo
{
public:
explicit Cfoo(int i):i_(i){}
void SetI(int i){ i_ = i; }
int GetI()const{ return(i_); }
private:
int i_;
};
class CfooHolderConst
{
public:
explicit CfooHolderConst(const Cfoo& foo):foo_(foo){}
int GetI()const{ return( foo_.GetI() ); }
private:
const Cfoo& foo_;
};
class CfooHolderNonConst
{
public:
explicit CfooHolderNonConst(Cfoo& foo):foo_(foo){};
int GetI()const{ return( foo_.GetI() ); }
void SetI(int i){ foo_.SetI(i); }
private:
Cfoo& foo_;
};
int main( int argc, char* argv[] )
{
const Cfoo myConstFoo(42);
CfooHolderConst myConstFooHolder(myConstFoo);
std::cout << myConstFooHolder.GetI() << std::endl;
Cfoo myNonConstFoo(1);
CfooHolderNonConst myNonConstFooHolder(myNonConstFoo);
myNonConstFooHolder.SetI(42);
std::cout << myConstFooHolder.GetI() << std::endl;
return(0);
}
我想将 CfooHolderNonConst 和 CFooHolderConst 组合成一个类,或者如果失败,则从另一个类继承一个。这里对 Cfoo 的引用是个问题,因为在 CFooHolderConst 中它需要定义为 const Cfoo&,而在 CfooHolderNonConst 中它需要定义为 Cfoo&。
这与此处的 interator/const_iterator 类似: How to avoid code duplication implementing const and non-const iterators?
...但我希望因为这不必满足 STL 迭代器的要求,所以可能有一个更简单的解决方案。
过去,我通过将 const 和 nonconst 指针作为类成员,并从重载的构造函数中设置一个或另一个来解决此类问题。这既浪费空间又显得笨拙。有没有更优雅的解决方案?
【问题讨论】:
标签: c++ const-correctness