【发布时间】:2018-08-22 08:44:15
【问题描述】:
假设我在某个本地范围内创建了一个对象,并将其添加到存在于该范围之外的向量中。
std::vector<sometype> Vec;
for( int i = 0, etc... )
{
sometype Object;
Vec.push_back(Object);
}
现在 Object 的副本将被传递给 Vec,而 Object 本身将被销毁。
但是,如果我继续这样做,我将继续创建许多名为“Object”的对象,这些对象存储在我的向量中。现在我可以通过它们的索引来访问它们,但是 C++ 如何处理我有很多对象显然都同名的事实呢?
【问题讨论】:
-
名称是本地变量。该变量在每次迭代时创建和销毁,每次引用不同的对象(通常恰好位于内存中的同一地址,但这只是编译器实现的细节)。对象的生命周期与其作用域 相关联——例如,在函数顶部声明的变量也是如此:每次调用函数时,都会为其作用域内的变量创建新对象。
-
对象在循环中不断被创建和销毁。循环内只有一个。它的名字无所谓,那纯粹是为了程序员的利益。
-
在 OO 语言中,有时将对象分类为“值对象”、“实体对象”和“服务对象”是很方便的。如果 sometype 是一个值类型,那么一切都应该是好的。如果 sometype 是实体类型(即对象具有标识),那么这可能是一个问题——可能由
std::vector<std::shared_ptr<sometype>>(或std::unique_ptr)解决。服务对象通常是单例或单态或(面向公众的)无状态的。 -
@Eljay 这与问题有什么关系?
-
@PasserBy • 如果对象是实体对象,那么对向量执行 push_back 将失去标识。如果这很重要。很难说,以非 MVCE 为例。