簡體   English   中英

嵌套類在抽象類中

[英]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個不同的標准容器(即vectorlistdeque )一起使用進行編譯

這樣,作為C ++用戶,您可以創建自己的容器,使其符合要支持的概念的要求,並能夠自動使用其他任何容器具有的所有算法。 無需接口,無需公共繼承,也不需要任何操作。

更不用說最近正在討論一個明確的Concept Lite建議 ,以更明確的方式實現這些“ 接口 ”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM