假设我们是一家汽车制造商,并且我们有一个抽象的
Part
类,如下所示:
class Part {
// notice that that all methods are const methods.
public:
Part():itsPartNumber(1) {}
Part(int PartNumber):itsPartNumber(PartNumber) {}
virtual ~Part() {};
int GetPartNumber() const { return itsPartNumber; }
virtual void Display() const = 0;
private:
int itsPartNumber;
};
这将是链表中的数据类,其中节点如下所示。
class PartNode
{
public:
PartNode(Part*);
~PartNode();
void setNext(PartNode* node) { itsNext = node; }
Part* GetPart() const;
PartNode* GetNext() const;
private:
Part* itsPart;
PartNode* itsNext;
};
现在我的问题是,我们无法真正操作
Part
实例,因为所有方法都是 const。因此,如果我们将所有 Part*
更改为仅 Part
有关系吗?或者数据本身应该是链表中的指针?
附言: 我不认为这是 Variable as point 的重复,因为它正在谈论
next
,当然,它必须是一个指针。
任何解释将不胜感激。
现在我的问题是,我们无法真正操作 Part 实例,因为所有方法都是 const。
没有
Part
实例。 Part
纯粹是抽象的(即各种其他语言中的 Interface
)。
virtual void Display() const = 0;
您无法实例化
Interface
。
因此,如果我们将所有
更改为Part*
是否重要?Part
嗯首先是的。你不能使用一个纯抽象
class
作为另一个class
中的成员变量,因为当类被实例化时,这意味着纯抽象class
也将被实例化。编译器不会允许这样做。
…我们无法真正操作
实例,因为所有方法都是Part
。因此,如果我们将所有const
更改为仅Part*
有关系吗?Part
无论是否是指针,只有
non-const
方法可以操作对象实例的成员,除非成员本身已声明mutable
[1]。
[1] 仅考虑“M&M 规则”的可变性。