gpt4 book ai didi

c++ - 用 const 成员替换一个类型的变量

转载 作者:行者123 更新时间:2023-12-05 02:41:40 24 4
gpt4 key购买 nike

假设我有一个包含一些常量成员的类:

class MyClass {
public:
MyClass(int a) : a(a) {
}
MyClass() : MyClass(0) {
}
~MyClass() {
}
const int a;
};

现在我想在某处存储一个 MyClass 的实例,例如作为全局变量或作为另一个对象的属性。

MyClass var;

稍后,我想给var赋值:

var = MyClass(5);

显然,这是行不通的,因为调用了assign运算符,默认情况下不存在,因为MyClass有一个const属性。到目前为止一切顺利。

我的问题是,我怎样才能给 var 赋值呢?毕竟,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;
};

我还没有添加 getter,因为您说通过 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 :/
}

Live Demo

缺点是它不能很好地与auto 配合使用。如果您可以通过任何方式接受 myObject.a(),我建议您使用它并保持简单。

关于c++ - 用 const 成员替换一个类型的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68018136/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com