使用可以是const或非const的属性创建对象的设计模式

时间:2016-10-17 10:05:26

标签: c++ class const instantiation

考虑以下具有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状态。

有没有可以帮助的设计模式?

2 个答案:

答案 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是变量类型的一部分 - 因此您可以使用intdouble提出相同的问题。这两个问题的答案现在都是,没有设计模式或语言功能可以做你想要的。否则,类型MyObject将不等于它本身,并且“实际类型”将仅由其实例化指定。 必须是一种非常不受欢迎的行为。

所以你(i)要么必须依赖类模板(你排除了这些模板,大概是因为你想在容器中存储MyObject的对象)。 (ii)或者您应该使用变体(这似乎是我的最佳选择)。 (iii)或者键入 - 删除类型HasAnotherObject。 (iv)或者,类似地,您可以使用继承。 (v)或可能使用其他替代方案,但都会有其缺点。