抽象类中的嵌套类

Anu*_*ava 5 c++ abstract-class nested-class inner-classes

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

class A
{
public:
    void func() = 0;
};
Run Code Online (Sandbox Code Playgroud)

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

#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;
}
Run Code Online (Sandbox Code Playgroud)

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

Spo*_*ook 5

试试这个:

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();
}
Run Code Online (Sandbox Code Playgroud)

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


编辑:回应评论

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

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

但是,如果您不再A<T>::Iterator是抽象类,则可以这样做。但是你将无法强迫一个人从A<T>::Iterator......