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,我不知道是否可以进行正式实现.
试试这个:
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......