如果class B
總是要與*a
作爲const
對象來工作,然後像其他人說,所有它需要的是申報簡單地改變
public: const A* a
在這一點上,我應該提到B::Func2
的恆定性是一個紅色的鯡魚,因爲它與B::a
的恆定性完全沒有關係。那B::Func2
是const
意味着它不允許更改值a
;然而,它是允許取消a
並mutate生成的對象。
現在,如果class B
相對於這兩個const
和非const
操作*a
那麼你一流的設計需要改變。如果您將class B
更改爲使用上述的const A* a
,並添加另一個封裝所有變異操作的class D : public B
會好得多。另外,a
應該隱藏在財產製定者的後面;這可以讓你做的事情一樣
class B {
const A* a;
public:
void setA(const A* a) { this->a = a; }
void Func2() const {}
};
class D : public B {
A* a;
public:
using B::setA;
void setA(A* a) {
this->a = a;
static_cast<B*>(this)->setA(const_cast<const A*>(a));
}
void Func3() { /* do something to D::a */ }
};
有了這個計劃既B
和D
保持獨立,要訪問適當類型指針的對象。如果setA
在B
上或D
上用const A*
參數調用,則只設置B::a
。如果在D
上調用了setA
且帶有A*
,則B::a
和D::a
都已正確設置。這已成爲可能,因爲通過抽象setter後面的成員,您可以將setter重載到參數的常量上。
來源
2012-05-17 12:25:20
Jon
當你有一個const函數時,你不能改變與該對象有關的任何東西。要麼稱它爲const * A a,要麼從函數中移除const。 – Martol1ni