разыменование в векторе указателей на объекты - PullRequest
2 голосов
/ 22 июня 2010

Я пытаюсь получить доступ к объекту (называемому вектором), на который указывает указатель, содержащийся в векторном контейнере, но я не могу добраться до него.

Вот важные фрагменты кода:

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; определеныElement.h, базовый класс Vectors.

Я все об этом не так?Я пытаюсь содержать все элементы производного класса в статическом члене данных базового класса, используя вектор указателей на основной класс.

Мой вывод из 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 ]

2 голосов
/ 22 июня 2010

Проблема не в разыменовании. Проблема в том, что оператор «<<» не определен для Element :: vectors </p>

1 голос
/ 22 июня 2010

Похоже, вам не хватает перегрузки 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 для вызова этой функции:

std::ostream& operator<<(std::ostream& stream, const Element& element)
{
    element.write_to_stream(stream);  // dynamic dispatch as we call through reference
    return stream;
}

Затем переопределите виртуальную функцию-член в производных классах, чтобы контролировать, как они должны быть записаны:

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