gpt4 book ai didi

c++ - 如何防止数组数据被修改?

转载 作者:行者123 更新时间:2023-12-03 07:35:35 26 4
gpt4 key购买 nike

假设我有一个如下所示的类(这只是一个示例):

class A {
double *ptr;
public:
A() : ptr( new double[100] ) {}
A( const A &other ) {
other.ptr[7] = 15;
}
void doNotChangeMyData() const {
ptr[43] = 14;
}
void changeMyData() {
ptr[43] = 14;
}
~A() { delete[] ptr; }
};

复制构造函数和 doNotChangeMyData 函数中的 const 使得 ptr 无法更改;但是,这仍然允许我修改 ptr 指向的数组的内容。

有没有一种方法可以防止仅在 const 实例中更改 ptr 数组的内容,除非“小心”(或从原始数据更改)指针)?

我知道我可以做类似的事情

void doNotChangeMyData() const {
const double *const ptr = this->ptr;
ptr[43] = 14; // then this would fail to compile
}

但我宁愿不必......

最佳答案

指针不会传播const。将 const 添加到类型 double* 会产生 double* const,这会在取消引用时产生非 const 左值.

相反,您可以使用std::vector:

class A {
std::vector<double> data(100);
public:
// no explicit copy ctor or dtor
};

一个std::array:

class A {
std::array<double, 100> data{};
public:
// no explicit copy ctor or dtor
};

或内置数组(不推荐):

class A {
double data[100] {};
public:
// no explicit copy ctor or dtor
};

所有三个选项都传播 const

如果您确实想要使用指针(不推荐),请考虑使用std::unique_ptr以避免手动内存管理。您可以使用库基础 2 TS 中的 std::experimental::propagate_const 包装器:(将原始数组与 unique_ptr 一起使用会有些复杂,如下面的评论中所述)

#include <array>
#include <memory>
#include <experimental/propagate_const>

class A {
std::experimental::propagate_const<std::unique_ptr<std::array<double, 100>>> ptr;
public:
A()
: ptr{std::make_unique<std::array<double, 100>>()}
{
}
// manual copy ctor
A(const A& other)
: ptr{std::make_unique<std::array<double, 100>>(*other.ptr)}
{
}
// defaulted move ctor & dtor
// assignment operator, etc.
// ...
};

它尚未成为标准,但许多编译器都支持它。当然,这种方法不如适当的容器。

关于c++ - 如何防止数组数据被修改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59267565/

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