我们可以使用 std::shared_ptr 来表示一个指向常量的共享指针,这样用户就不能通过这个指针修改数据。
#include <iostream>
#include <memory> // 包含智能指针的定义
class hhhh {
public:
hhhh(int h) : myNumber(h) {}
// 使用智能指针返回一个指向常量的指针
std::shared_ptr<const int> getData() const {
return std::shared_ptr<const int>(&myNumber, [](const int*){}); // 使用自定义删除器,防止删除内部成员
}
// 可以添加一个获取数据的简单方法,返回值的引用
int getDataValue() const {
return myNumber;
}
private:
int myNumber;
};
int main() {
int myNumber = 123;
// 使用 std::unique_ptr 动态创建 hhhh 的实例
std::unique_ptr<hhhh> h = std::make_unique<hhhh>(myNumber);
// 获取智能指针并打印数据
auto dataPtr = h->getData();
std::cout << "通过函数返回的智能指针获取的数据: " << *dataPtr << std::endl;
// 或者使用简单的方法获取并打印数据
int dataValue = h->getDataValue();
std::cout << "通过简单方法获取的数据: " << dataValue << std::endl;
// 当 h 超出范围时,它会自动删除 hhhh 的实例
return 0;
}
关于 getData 方法返回 std::shared_ptr 的部分,我仍然认为这不是一个好的实践,因为 myNumber 是 hhhh 类的一个成员,而不是一个动态分配的对象。更好的做法是直接提供一个访问器方法(如 getDataValue),或者如果需要,返回一个指向常量的引用 const int&。