如何声明派生类对象的迭代器?

Posted

技术标签:

【中文标题】如何声明派生类对象的迭代器?【英文标题】:How to declare iterators to derived class object? 【发布时间】:2012-02-16 00:25:55 【问题描述】:

我是否正确地声明了派生类 r_iter 和 c_iter 的迭代器? 在派生类中,r_iter 是二维向量的迭代器,c_iter 是二维向量的迭代器。

我收到以下错误,如果有人告诉我哪里错了,我将不胜感激

add_round_key.cpp:26:34: error: expected class-name before ‘’ token
add_round_key.cpp:27:2: error: ‘dVector’ is not a template
add_round_key.cpp:27:11: error: ‘dVector’ is not a template
add_round_key.cpp:27:28: error: invalid use of ‘::’
add_round_key.cpp: In member function ‘void dVector::RotWord()’:
add_round_key.cpp:37:2: error: ‘r_iter’ was not declared in this scope
add_round_key.cpp:37:17: error: ‘class dVector’ has no member named ‘begin’
add_round_key.cpp:38:2: error: ‘c_iter’ was not declared in this scope





line# 26    class dVector:public std::vector 
line# 27             dVector <dVector <int> >::iterator r_iter;
                     dVector <int>::iterator c_iter;

                      public:
                      void RotWord();
                        void SubWord();
              ;

            void dVector::RotWord() 
                  int temp ;
line# 37          r_iter = this->begin(); 
     #38          c_iter = (*r_iter).end();
                 *(c_iter) = *(c_iter+4);
               *(c_iter+4) = *(c_iter+8);
            


          void dVector::SubWord()
              //function definition
        

    int main (int argc, char *argv[]) 
    

        /*wordArray is a 4x4 word array stored in column-order form*/
        dVector <dVector <int> > wordArray(4,dVector<int>(40,0));
        dVector <dVector <int> >::iterator ckIter,i ,j, row_iter;
        dVector <int>::iterator ii,jj, col_iter;
        wordArray.RotWord();
        wordArray.Subword();
    

【问题讨论】:

【参考方案1】:

第 26 行:std::vector 是一个模板,您需要告诉它要专攻什么才能使其成为可以继承的类。

第 26 行奖励:避免从标准容器继承

第 27 行:dVector 是模板吗?如果不是,你就不能像它一样使用它!

第 37-38 行:第 27 行和第 28 行中的错误导致 r_iterc_iter 未被声明,因此您在这些行中遇到了错误。

也就是说,这可能会帮助您完成您想要做的事情:

template<class T>
class dVector : public std::vector<T> 
   typename dVector <dVector <T> >::iterator r_iter;
   typename dVector <T>::iterator c_iter;

但建议仍然存在,don't inherit from std containers。

【讨论】:

非常感谢。我以同样的方式对待容器和类。非常感谢您的 cmets【参考方案2】:

我认为您在继承之前忘记将模板类型分配给 std::vector

class dVector:public std::vector         // Not valid

class dVector:public std::vector<int>    // Valid

【讨论】:

以上是关于如何声明派生类对象的迭代器?的主要内容,如果未能解决你的问题,请参考以下文章

迭代器模式(java版)

通过 C++ 中的 std 迭代器将基类转换为派生

python学习之创建迭代器对象

如何在基类中实现子类迭代器的统一接口?

007-迭代器-生成器-协程

什么是迭代器,Python迭代器及其用法