【发布时间】:2014-03-16 13:39:44
【问题描述】:
我有一个类A 和一个结构B(它是一个普通的旧数据结构)。这两者以A在某种意义上代表整个系统的状态的方式对系统进行建模,并且由多个Bs和其他状态组成。这意味着如果没有A,B 可能毫无价值。我想创建一个 API,您可以在其中“添加”Bs 到 A,然后直接修改 Bs 的状态(通过保留对它们的引用之类的东西)。
不过,我不确定如何根据所有权进行设计。我有几个选择。这很复杂,因为我使用的是 C++。如果我使用 Java,我可能会这样设计代码:
class A {
private List<B> bs = new ArrayList<>();
public void add(B b) {
bs.add(b);
}
}
API 的用户自己创建Bs 的地方,或者像这样:
class A {
private List<B> bs = new ArrayList<>();
public B create(int data) {
B b = new B(data);
bs.add(b);
return b;
}
}
A 系统自行创建对象。这可能是更好的方法,因为没有A,Bs 什么都不是。我什至可以以某种方式使B 构造函数只能由A 访问,但我不确定如何。
但请记住,这是在 Java 中。这个系统是用 C++ 编写的,它的工作方式不同。
我想第一个例子看起来很相似:
class A {
public:
void add(B& b)
{
bs.push_back(&b);
}
private:
std::vector<B*> bs;
};
但由于我更喜欢第二个选项,所以我尝试翻译它:
class A {
public:
B& create(int data)
{
bs.emplace_back(data);
return bs.back();
}
private:
std::vector<B> bs;
};
但在这种情况下,我返回的是对 B 的引用。当bs 被调整大小时,它可能会在内存中移动,从而使返回的引用无效。你将如何解决这个问题?或者你会尝试以什么其他方式来设计这个?
【问题讨论】:
-
首先,不要取引用,存储指针。使所有权和生命周期明确。谁有权访问
B?他们如何命名它?这种访问持续多长时间?B能比它的A活得更久吗?B是只读数据,还是必须处于活动状态?你能让B不可变吗?您拥有完整的选项菜单,所提供的信息不会缩小到一个答案。给出一个不那么抽象的描述和你的抽象描述一样,你可能不知道抽象哪些细节是安全的。 -
这是一个刚体物理模拟。
A是一个世界,其中存储了它们之间的身体和关节。B是一个刚体,包含身体的形状、当前位置和速度等信息。
标签: c++ oop pointers reference ownership