c++ - 抽象类中的嵌套类

标签 c++ abstract-class inner-classes nested-class

我有一个像这样的抽象类:

class A
{
public:
    void func() = 0;
};

我可以强制它的实现也有一个嵌套的迭代器类吗?

#include <iterator>

template<typename T>
class A
{
public:
    class Iterator : public std::iterator<std::forward_iterator_tag, T>
    {
    };

    virtual Iterator begin() const = 0;
    virtual void func() = 0;
};

template<typename T>
class B : public A<T>
{
public:
    B() {}
    class Iterator : public std::iterator<std::forward_iterator_tag, T>
    {
    };

    Iterator begin() const
    {
        return Iterator();
    }

    virtual void func()
    {
    }
};

int main()
{
    B<int> b;
}

我只想知道这是否可行,如果可行,我错过了什么?由于迭代器类将取决于类A的实现方式,我不知道是否可以正式实现。

最佳答案

试试这个:

template<typename T>
class A
{
public:
    class Iterator : public std::iterator<std::forward_iterator_tag, T>
    {
    public:
        virtual void DoSomething() = 0;
    };

    virtual Iterator * begin() const = 0;
    virtual void func() = 0;
};

template<typename T>
class B : public A<T>
{
public:
    B() {}
    class BIterator : public A<T>::Iterator
    {
    public:
        void DoSomething()
        {
            std::cout << "Hello world from B::BIterator!";
        }
    };

    A<T>::Iterator * begin() const
    {
        return new BIterator();
    }

    virtual void func()
    {
    }
};

int main(int argc, char * argv[])
{
    B<int> b;

    A<int>::Iterator * iter = b.begin();
    iter->DoSomething();
    delete iter;

    getchar();
}

请注意,这不会强制 B 实现A<T>::Iterator 的新实例,而只是提供一个。例如,开发人员可以实现一个通用迭代器并从所有 A<T> 中返回它-派生类。但我想,这应该足够了,不是吗?


编辑:回应评论

您应该通过指针返回迭代器。由于您希望它是一个抽象类,因此您不能像这样声明它的实例:

A<int>::Iterator iter = b.begin(); // Error: cannot instantiate abstract class
                                   // A<int>::Iterator

但是,如果您从 A<T>::Iterator 辞职,您可以这样做作为一个抽象类。但是那样你就不能强制一个人从 A<T>::Iterator 下降。 ...

关于c++ - 抽象类中的嵌套类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22321351/

相关文章:

c++ - LZW C++ 简单实现

Java初始化抽象类

c++ - 在 C++ 中,如何调用在抽象基类和派生类中都有定义的基类的虚函数定义?

python - 嵌套类的范围?

c++ - 使用 ShellExecute C++ 打开长 url

c++ - 一个C++项目编译发布调试同时进行

jsf-2 - 无法访问 bean 中的内部类

java - 更优雅的内部方法声明(没有所有的困惑)?

c++ - std::array<T, N> 的大小是否保证等于 T[N] 的大小?

c# - 没有从 <T> 到 'Microsoft.WindowsAzure.Storage.Table.ITableEntity' 的装箱转换或类型参数转换