多态向量

时间:2014-12-09 07:30:12

标签: c++ visual-c++

嗨,有人可以解释下面的代码有什么问题吗?我首先在另一个将要使用这个孩子的类中包含一个抽象类的子项。

#include "child.h"

然后我用下面的指针填充下面的2d向量。

vector<vector<abstractitem*>*>vec;

然后我在班上使用这个类函数。函数get可以在抽象类中找到。

void fn::getall()
{
    for (int i=0;i<m_nrows;i++)
    {
        for(int j=0;j<m_ncolumns;j++) 
        {   

            vec[i][j]->get(); //error on this line: do you intend to use . instead?

        } 
        printf("\n");
    }  

} 

非常感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

您需要更改

vector<vector<abstract*>*> vec;

vector<vector<abstract*>> vec;

或更改

vec[i][j]->get();

(*vec[i])[j]->get();

前者可能更好,外部矢量应该保持指向内部矢量的指针是没有充分理由的。

更好的是使用智能指针:

vector<vector<shared_ptr<abstract>>> vec;

它让你完全摆脱对象内存管理

答案 1 :(得分:1)

请注意,您的外部矢量是指向矢量的指针的矢量,而不是矢量的矢量。这意味着您的函数调用将解析为:

vec[i][j]->get();
(vector<abstractitem*>*)[j]->get();
*(vector<abstractitem*>* + j)->get();
vector<abstractitem*> ->get();

您可以在最后一行看到错误:您的get()函数正在尝试在向量上运行,但您编写它期望它是abstractitem*

将声明更改为向量矢量,或者为您的调用添加取消引用:

vector<vector<abstractitem*>> vec; //option 1
(*vec[i])[j]->get(); //option 2