gpt4 book ai didi

c++ - 私有(private)继承 vs 公开迭代器

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:43:22 25 4
gpt4 key购买 nike

假设我有一个类,其中包含一些其他类,而这些类又包含一些容器。而且我需要能够在最外层的类中迭代该容器而不公开它。这可以通过私有(private)继承或公开容器迭代器的方式来完成。

公开迭代器:

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;
};

私有(private)继承:

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
}
};

我很感兴趣做这种事情的首选方式应该是什么,这两种方法和其他可能的解决方案的优缺点。这主要是假设性问题,因为我已经更改了代码设计,但我仍然很好奇。

最佳答案

这两种方法之间的主要区别在于,第一个实现公开了一个适合迭代容器元素的范围,而第二个实现公开了整个容器,但仅限于其派生类。

首选方法取决于您的设计:如果您希望公开一个可以迭代到类外部的范围,请使用第一种方法;如果您不想公开迭代范围,请考虑使 begin()end() protected ,而不是公开。

我会再次推荐使用私有(private)继承的方法,因为它会向代码的读者发送错误消息。通常,非公共(public)继承表示派生类是根据其基类实现的。但是,您的代码使用这种技术进行访问控制,这可能会使代码的读者感到困惑。

关于c++ - 私有(private)继承 vs 公开迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25222728/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com