考虑以下具有1个成员变量和2个构造函数的对象。
MyObject {
const [or not] HasAnotherObject *m_pOtherObject;
MyObject(HasAnotherObject *pOtherObject);
MyObject(const HasAnotherObject *pOtherObject);
}
我想实例化一个非const和一个const MyObject。成员变量还必须具有与局部变量相同的const状态。
MyObject myObjectVolatile(HasAnotherObject *pOtherObject);
const MyObject myObjectConst(const HasAnotherObject *pOtherObject);
但是,类模板必须指定与实例化方法无关的const状态。
有没有可以帮助的设计模式?
答案 0 :(得分:0)
外部建议: 一个非const成员变量:
HasAnotherObject *m_pOtherObject
和2种方法:
const HasAnotherObject hasAnotherObject() const {return m_pOtherObject;}
HasAnotherObject hasAnotherObject() {return m_pOtherObject;}
和2个构造函数:
MyObject(HasAnotherObject *pOtherObject): m_pOtherObject(pOtherObject) {}
MyObject(const HasAnotherObject *pOtherObject): m_pOtherObject((HasAnotherObject *) pOtherObject) {}
使用const和非const选项。 const构造函数必须进行令人不愉快的转换才能删除const
答案 1 :(得分:0)
在C ++中,const
是变量类型的一部分 - 因此您可以使用int
和double
提出相同的问题。这两个问题的答案现在都是,没有设计模式或语言功能可以做你想要的。否则,类型MyObject
将不等于它本身,并且“实际类型”将仅由其实例化指定。 必须是一种非常不受欢迎的行为。
所以你(i)要么必须依赖类模板(你排除了这些模板,大概是因为你想在容器中存储MyObject
的对象)。 (ii)或者您应该使用变体(这似乎是我的最佳选择)。 (iii)或者键入 - 删除类型HasAnotherObject
。 (iv)或者,类似地,您可以使用继承。 (v)或可能使用其他替代方案,但都会有其缺点。