假设我有一个类,其中包含一些其他类,而这些类又包含一些容器。而且我需要能够在最外层的类中迭代该容器而不公开它。它可以通过私有继承或暴露容器迭代器来完成。
公开iteratos:
template <typename Container>
class Details
{
public:
//some methods useful for the Test class
using ContIter = typename Container::const_iterator;
ContIter begin() { return std::begin(cont); }
ContIter end() { return std::end(cont); }
private:
Container cont;
};
template <typename Container>
class Test
{
public:
void contrived() {
for(const auto& i : details)
;//do something
}
private:
Details<Container> details;
};
私人继承:
template <typename Container>
class Details
{
public:
//some methods useful for the Test class
protected:
Container cont;
};
template <typename Container>
class Test : Details<Container>
{
public:
void contrived() {
for(const auto& i : this->cont)
;//do something
}
};
我感兴趣的是做这种事情的首选方式,两种方法的优点和缺点以及其他可能的解决方案。这是一个假设性的问题,因为我改变了我的代码设计,但尽管如此,我仍然很好奇。
答案 0 :(得分:2)
这两种方法的主要区别在于第一个实现公开公开了一个适合迭代容器元素的范围,而第二个实现公开了整个容器,但只暴露给它的派生类。
首选方法取决于您的设计:如果您希望公开可以迭代到课堂外部的范围,请使用第一种方法;如果您不想公开迭代范围,请考虑将begin()
和end()
保护,而不是公开。
我会再次推荐使用私有继承的方法,因为它会向代码的读者发送错误的消息。通常,非公共继承表示派生类是根据其基类实现的。但是,您的代码使用此技术进行访问控制,这可能会困扰您的代码的读者。