Возвращает указатель класса, когда запрашивается указатель структуры (C ++) - PullRequest
1 голос
/ 01 февраля 2012

У меня есть скелет проекта, который мне нужен для реализации двусвязного списка (без использования stl), и способ реализации класса состоит в том, чтобы наследовать все методы из структуры, например:

struct IDoubleList { 
virtual IDoubleNode * getHead() = 0;
virtual IDoubleNode * getTail() = 0;
virtual void setHead(IDoubleNode * head) = 0;
virtual void setTail(IDoubleNode * tail) = 0;
virtual void addBack(int value) = 0;
};

class DoubleList : public IDoubleList {
public:
virtual IDoubleNode * getHead();
virtual IDoubleNode * getTail();
virtual void addBack(int value);
virtual void setHead(IDoubleNode * head);
virtual void setTail(IDoubleNode * tail);
private:
DoubleNode* m_Head;
DoubleNode* m_Tail;
};

Поскольку вы можете использовать методы получения и установки, а не класс для возврата / передачи указателей. Мой вопрос заключается в том, как я могу использовать методы в объекте, на который указывает m_Tail. Я пытался использовать m_Tail.setNext (newNode); где setNext - это метод в классе DoubleNode, но в нем говорится, что выражение должно иметь тип класса.

Также, когда я возвращаю / передаю DoubleNode *, должен ли я выполнять кастинг или что-то в IDoubleNode *? а может наоборот?

PS Давненько я не использовал C / C ++, может быть, я забыл кое-что о указателях функций? ИДК сейчас потерян

Спасибо заранее, дайте мне знать, если вам нужна дополнительная информация

Ответы [ 2 ]

1 голос
/ 01 февраля 2012

Прежде всего, это должно быть m_Tail->setNext(newNode), а не m_Tail.setNext(newNode), потому что m_Tail является указателем.Вы также можете сделать (*m_Tail).setNext(newNode), суть в том, что вам нужно как-то разыменовать указатель.

Нет, вам не нужно приводить указатель от DoubleList к IDoubleList при передаче егофункция ожидает IDoubleList.Это потому, что каждый DoubleList является IDoubleList, поэтому кастинг не требуется.Кроме того, только разница между struct и class является уровнем доступа членов по умолчанию (public для struct, private для class).

0 голосов
/ 01 февраля 2012

Во-первых, вы должны сделать IDoubleNode базовым классом вашего DoubleNode (если вы этого еще не сделали).Затем вам нужно dynamic_cast<DoubleNode*>(ptr) в методах, принимающих IDoubleNode*, чтобы получить ваш DoubleNode (и, например, выдать исключение, если это не удалось).Также убедитесь, что вы используете обозначение указателя при доступе к элементам указателей, то есть ptr->member вместо ptr.member: последнее обозначение работает только для объектов.Вы могли бы использовать (*ptr).member, но это излишне надумано.

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

...