我有一个项目的框架,我需要实现一个双向链接列表(不使用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;
};
因为你可以使用struct而不是类来返回/传递指针。我的问题是如何使用m_Tail所指向的对象中的方法。我尝试使用m_Tail.setNext(newNode);其中setNext是DoubleNode类中的方法,但表示表达式必须具有类类型。
当我返回/传递一个DoubleNode *时,我应该投射什么东西到IDoubleNode *?或者反过来呢?
PS已经有一段时间了,因为我使用过C / C ++,也许我忘记了一些关于函数指针的东西? idk现在迷路了
先谢谢,如果您需要更多信息,请与我们联系
答案 0 :(得分:1)
首先,它应该是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
1}}表示{{1}})。
答案 1 :(得分:0)
首先,您应该将IDoubleNode
作为DoubleNode
的基类(如果您还没有)。然后,您需要dynamic_cast<DoubleNode*>(ptr)
在方法中IDoubleNode*
获取DoubleNode
(例如,如果失败则抛出异常)。此外,请确保在访问指针成员时使用指针表示法,即ptr->member
而不是ptr.member
:后一种表示法仅适用于对象。您可以使用(*ptr).member
,但这是不必要的设计。
最后,不要忘记告诉你的教练下次设置合理的作业,因为这是一个完全没有意义的练习:这是使用面向对象方法的坏例子(你可以通过基类接口颠覆类型安全)和在数据结构类中使用面向对象的方法毫无意义。