需要创建一个对象的实例(例如string),以便它满足以下条件:
它不能被覆盖 - 即
//声明和定义字符串a的一个实例(这个实例必须满足这些条件)
//字符串b的其他实例的声明和定义
a = b; //不可能的
实例可以通过其方法进行修改
问题:如何声明这样的实例?
PS我来自Java,这final ArrayList<Integer> a仅意味着不可能用a其他人覆盖ArrayList,但是,我们可以将元素添加到此列表中并删除它们。在 C++ 中,如果一个对象被标记为,const我们不能以任何方式改变它。
UPD
问题是这样的:我有一个类Scene(简化,可以这样表示):
class Scene {
private:
std::vector<GameObject*> instances;
public:
const GameObject& getInstance(unsigned int id);
void destroyInstance(unsigned int id);
}
该类GameObject具有允许您更改其状态的方法。同时,它getInstance()应该返回一个指针/引用GameObject,而我不希望它可以覆盖GameObject返回的链接所定位的/指针,但是,同时,我希望能够调用方法改变GameObject它的状态。这只能通过禁止运营商来实现吗?
好吧,在 C++ 中(因为你把那个标签放进去)它只是. 禁用复制/移动构造函数和赋值,就是这样。
(在旧的 C++ 中使它们
private没有主体)。现有类 - 它的语义是完全定义的。比如说,继承它或将其隐藏在包装器中,并且已经禁止他/她。
这里应该澄清一下,Java 和 C++ 中赋值和引用的语义是完全不同的。在表达式中,
final ArrayList<Integer> aa它是一种引用类型,并final防止引用绑定到另一个对象。在 C++ 中,引用类型原则上不能被强制引用另一个对象(即,它们总是final从 Java 的角度来看),但是,在分配对象时调用 = 运算符无非是改变对象通过它的方法,而不是绑定对另一个对象的引用。此外,在 C++ 中,可以在没有引用的情况下使用对象,在这种情况下
const,限定符final对 Java 中的基本类型的工作方式类似。在 C++ 中,类实例缺少标识,因此您通常无法判断对象是否已被覆盖或变异。而在 Java 中,您可以使用 == 运算符比较两个值并确定它们是否是同一个对象,而在 C++ 中,== 运算符要么被重载并按值比较,要么不重载而只是丢失。
您也可以这样说:赋值运算符与其他方法是相同的变异方法。
所以你试图做的只是没有意义。
也许您确实需要限制可以修改对象的方式的数量。在这种情况下,您需要编写一个包装类。我注意到,与 Java 不同,在 C++ 中,没有虚拟成员的类是免费的:它们不需要额外的内存,除了其成员的内存,并且如果可能的话,方法调用由优化器内联。
例如,您可以这样做: