[英]Resizing vector of object of nested class inside abstract class
[英]Nested class inside an abstract 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
下降……
我只想知道這是否可能,如果可以,我想念的是什么?
好吧,不,除非您為Iterator
定義了至少一個純虛擬成員函數,否則您不能強制派生類具有一個。
標准庫解決此問題的方法是使用概念 。 它們是模板參數的約束 ,而模板參數又為公共對象定義公共接口。
以Container
概念為例:它要求通用類型T
具有以下有效表達式:
T::reference
T::const_reference
T::iterator
這樣,您可以定義一個函數:
template<class Container>
void do_something(Container c) {
Container::iterator it = c.begin();
// etc
}
並期望它能與適合Container
概念的每種類型一起使用。 實際上,以上代碼可以很高興地將其與3個不同的標准容器(即vector
, list
和deque
)一起使用進行編譯 。
這樣,作為C ++用戶,您可以創建自己的容器,使其符合要支持的概念的要求,並能夠自動使用其他任何容器具有的所有算法。 無需接口,無需公共繼承,也不需要任何操作。
更不用說最近正在討論一個明確的Concept Lite建議 ,以更明確的方式實現這些“ 接口 ”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.