Я работаю над проектом C ++, который имеет дело с графиками. Он обладает множеством функциональных возможностей, связанных с классом «Node» и классом «Edge».
Сначала Edge хранит копии своего начального узла и конечного узла; что-то вроде:
class Edge{
...
private:
Node m_start, m_end;
...
}
Чтобы сделать некоторые функции модификации графа более эффективными, я решил сделать указатели классов Edge вместо них на начальный и конечный узлы:
class Edge{
...
private:
Node* m_start, m_end;
...
}
Таким образом, я внес изменения в файлы / связанные функции 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
Ты выстрелил себе в обе ноги. Так должно быть:
Node* m_start, * m_end;
В следующий раз просто оплатите дополнительную строку экрана и напишите:
Node * m_start;
Node * m_end;
Вы будете делать всем одолжение.
Node* m_start, m_end;
Это заявляет m_start
как Node*
, но это заявляет m_end
как Node
, Код для создания обоих указателей будет выглядеть так:
Node* m_start, *m_end;