我有一个像这样的抽象类:
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/