假设我有一个包含一些常量成员的类:
class MyClass {
public:
MyClass(int a) : a(a) {
}
MyClass() : MyClass(0) {
}
~MyClass() {
}
const int a;
};
现在我想存储一个实例MyClass
某处,例如作为全局变量或作为另一个对象的属性。
MyClass var;
后来我想给它赋值var
:
var = MyClass(5);
显然,这是行不通的,因为调用了赋值运算符,默认情况下该运算符不存在,因为MyClass
有一个 const 属性。到目前为止,一切都很好。
我的问题是,如何为var
anyway?毕竟,var
其本身未被声明为常量。
到目前为止我的想法
我知道如果我使用指针就不存在这个问题var
:
MyClass *var;
var = new MyClass(5);
但是,出于方便原因,我不想使用指针。
一个可能的解决方案是用新的位置覆盖内存:
template<class T, class... Args>
T &emplaceVar(T &myVar, Args&&... args) {
myVar.~T(); // free internal memory
return *new (&myVar) T(args...);
}
emplaceVar(var, 5);
这可以解决问题,但我不确定这是否会导致内存泄漏或由于我缺乏 c++ 经验而没有想到的任何其他问题。此外,我认为一定有一种更简单的方法。有没有?
const
由于您所发现的原因,成员总体上存在问题。
更简单的选择是让成员private
并注意不要提供从类外部修改它的方法:
class MyClass {
public:
MyClass(int a) : a(a) {
}
MyClass() : MyClass(0) {
}
~MyClass() {
}
private:
int a;
};
我还没有添加吸气剂,因为你说通过myObject.a
是一个硬性要求。启用此功能需要一些样板文件,但它比修改不得修改的内容要简单得多:
class MyClass {
public:
struct property {
const int& value;
operator int(){ return value;}
property(const property&) = delete;
};
MyClass(int a = 0) : value(a) {}
private:
int value;
public:
property a{value};
};
int main(){
MyClass myObject{5};
int x = myObject.a;
//myObject.a = 42; // error
//auto y = myObject.a; // unexpected type :/
}
现场演示 https://godbolt.org/z/93Gv8hYx9
缺点是不能很好地配合auto
。如果无论如何你能接受myObject.a()
我建议使用它并保持简单。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)