2013-10-07 4 views
1

Я работаю над проектом на C++, который имеет дело с графиками. Он имеет множество функций, связанных с классом «Node» и классом «Edge».Базовый операнд имеет не указательный тип ... но это указатель?

Во-первых, Edge хранит копии своего стартового узла и его конечного узла; что-то вроде:

class Edge{ 
... 
private: 
    Node m_start, m_end; 
... 
} 

Для того, чтобы некоторые функции графика модификации более эффективными, я решил сделать класс пограничного магазин указатели на начало и конечные узлы вместо:

class Edge{ 
    ... 
    private: 
    Node* m_start, m_end; 
    ... 
} 

I, таким образом, внес коррективы в CPP файлы/связанные функции для обеспечения надлежащего доступа (например, изменение . с до -> с). Одним из примеров является функция печати:

void 
Edge::Print(ostream& _os){ 
    _os << "EdgeID = " << m_id << endl 
    << "Connects nodes: " << m_start->GetIndex() << " and " << m_end->GetIndex() << endl; 
} 

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

Models/Edge.cpp: In member function ‘virtual void Edge::Print(std::ostream&) const’: 
Models/Edge.cpp:32: error: base operand of ‘->’ has non-pointer type ‘const Node’ 

[где 32 строка в приведенном выше примере, которая начинается с << "Connects nodes: "]

Что здесь происходит? m_start Я могу указать указатель, насколько я могу судить! Может быть что-то не так в назначении? Функция GetIndex() вызывается в примере выглядит следующим образом, и та же ошибка происходит с или без const:

int GetIndex() const { return m_index; } //in Node.h 

ответ

7

Вы сняли себя в обеих ногах. Оно должно быть:

Node* m_start, * m_end; 

В следующий раз, просто заплатить дополнительную строку экрана и написать:

Node * m_start; 
Node * m_end; 

Вы будете делать каждую услугу.

3
Node* m_start, m_end; 

Объявляет m_start как Node*, но он объявляет m_end как Node. Код для их обоих указателей будет выглядеть так:

Node* m_start, *m_end;