这里单类是一组实现了一种适配器模式的C++类:它结合常量和非const引用数据成员
#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 &。
这是一个类似问题的迭代符/常量性在这里: How to avoid code duplication implementing const and non-const iterators?
...但我希望,因为这并没有满足STL迭代器的要求,有可能是一个简单的解决方案。
在过去,我通过将const和nonconst指针同时作为类成员,并且从重载的构造函数中设置一个或另一个来解决这类问题。这浪费了空间,似乎笨拙。有没有更优雅的解决方案?
我的建议是不让数据成员受到保护,因为它破坏封装,而是使用友谊。 – AndrzejJ 2012-02-21 15:07:00
我不喜欢从基类到派生类的友谊。通常我会使用受保护的get()来获取底层。如果您真的坚持,您可以使用私有继承和使用来将Get方法从基类中公开。 我只是在这里说明如何在这种情况下可以完成。 – CashCow 2012-02-21 18:11:56
这看起来很有前途。我可能会选择你的或AndrzejJ的解决方案。 – 2012-02-21 22:07:32