2010-06-22 145 views
2

我试图访问指向一个矢量容器中的指针指向的对象(称为矢量),但我似乎无法得到它。解引用指向对象的指针

以下是重要的代码片段:

int main{ 
    Vector<double>* test = new Vector<double>(randvec<double>()); 

    test->save(); 

    cout << Element::vectors[0]; 
return 0; 
} 

Vector是一个模板类,randvec<T>()返回到一个向量的引用,save()

template <class T> 
void Vector<T>::save() 
{ 
    vectors.push_back(this); 
} 

和载体是在元素中定义static std::vector<Element*> vectors;。 h,Vector的基类。

我对这一切都错了吗?我试图通过使用指向主类的指针向量来将派生类的所有元素包含在基类的静态数据成员中。

我从main()的输出可能会告诉你发生了什么 - 我得到指针0x1001000a0。但是,如果我尝试取消引用该指针,我得到以下错误:

error: no match for 'operator<<' in 'std::cout << * Element::vectors. 
std::vector<_Tp, _Alloc>::operator[] [with _Tp = Element*, _Alloc = std::allocator<Element*>](0ul)' 

为什么我不能解引用这个指针?

+2

为什么动态分配,在所有? (提示:你正在泄漏!) – GManNickG 2010-06-22 06:52:38

+0

我花了三次阅读你的描述来了解你的名字的不同部分是如何相互纠缠的!这是否真的需要两阶段建设?如果所有对象都要存储在基类静态数据成员中,为什么不将它们存储在构造函数中?你为什么使用'test'的动态分配?你在泄漏它。自动对象有什么问题?哦,在C++'file!= class'中。 – sbi 2010-06-22 07:17:44

回答

2

问题不在于取消引用。问题是,“< <”运营商没有为元素定义::向量

1

它看起来像你缺少一个operator<<过载,可用于输出Element。请注意,如果您仅为Vector<T>定义过载,则它将不起作用,因为解引用Element::vectors[0]会为您提供Element类型的对象。

下面是一个(未经测试,抱歉),你可以如何去使派生类(如Vector<T>)覆盖的Element流插入行为例如:

添加虚拟成员函数Element

class Element 
{ 
    // other stuff 

    virtual void write_to_stream(std::ostream& stream) const = 0; 
}; 

超载operator<<Element调用这个函数:

​​

然后重写虚成员函数在派生类控制他们应该怎么写:

template<class T> 
class Vector : public Element 
{ 
    // other stuff 
    virtual void write_to_stream(std::ostream& stream) const 
    { 
     // whatever you like goes here 
    } 
}; 
+0

等一下,为什么不会解除引用两次给我一个类型为Vector的对象? 我已经定义了Vector 的输出运算符,这就是我正在尝试使用的运算符。我如何与该版本交互 - 是否必须投射指针? – 2010-06-22 04:42:45

+0

即使它所指向的对象的动态类型为“* Element :: vectors [0]”,静态类型为“Element”(因为Element :: vectors [0]是一个Element *确实'Vector '(你说的对,我可能不应该说它是一个“元素”类型的对象!)一个方法来获得重载'载体'中的'operator <<'的能力是委托给一个虚拟功能 - 我会给我的答案添加一个例子。 – 2010-06-22 04:51:18

+0

...其中“它指向”我的意思是“Element :: vectors [0]'指向”...... – 2010-06-22 05:09:16