当被问到struct pointer(C ++)时,返回类指针

时间:2012-01-31 23:40:48

标签: c++ visual-c++ pointers struct function-pointers

我有一个项目的框架,我需要实现一个双向链接列表(不使用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现在迷路了

先谢谢,如果您需要更多信息,请与我们联系

2 个答案:

答案 0 :(得分:1)

首先,它应该是m_Tail->setNext(newNode),而不是m_Tail.setNext(newNode),因为m_Tail是指针。你也可以做(*m_Tail).setNext(newNode),关键是你必须以某种方式取消引用指针。

不,在将DoubleList传递给期望IDoubleList的函数时,您无需将指针从IDoubleList投射到DoubleList。这是因为每个 IDoubleList 都是 struct,因此不需要进行转换。此外,classpublic之间的差异是成员的默认访问级别(struct private class 1}}表示{{1}})。

答案 1 :(得分:0)

首先,您应该将IDoubleNode作为DoubleNode的基类(如果您还没有)。然后,您需要dynamic_cast<DoubleNode*>(ptr)在方法中IDoubleNode*获取DoubleNode(例如,如果失败则抛出异常)。此外,请确保在访问指针成员时使用指针表示法,即ptr->member而不是ptr.member:后一种表示法仅适用于对象。您可以使用(*ptr).member,但这是不必要的设计。

最后,不要忘记告诉你的教练下次设置合理的作业,因为这是一个完全没有意义的练习:这是使用面向对象方法的坏例子(你可以通过基类接口颠覆类型安全)和在数据结构类中使用面向对象的方法毫无意义。