将公共成员设置为只读
making public member read only
class A{
private:
int a;
public:
const int &ref = a;
};
int main() {
A obj;
obj.a = 20; // error cause private
obj.ref = 30; // not private but const so ERROR
return 0;
}
我正在尝试使成员变量可访问,但只能通过界面读取。目前我已经尝试了这种方法,它似乎编译得很好。我对原始变量int a
进行了const reference
,并使其public
。这种做法有什么问题,我可能会错过吗?或者这个例子是否安全无虞,可以用于实际目的?
提供应用了const
正确性的成员函数没有错(我也使用它并打算一直这样做),但是如果我必须提供一个变量,我问这种方式有什么问题只是只读的。
谢谢:)
class A{
private:
int a;
public:
const int &ref = a;
};
如果我必须提供一个只读的变量,这种方式有什么问题吗
对于 A
类,这种设计决策至少有几个缺点。
1:班级规模
正如迪特尔·吕金(Dieter Lücking)在评论:
不必要地增加班级规模
2:复制语义
它破坏了编译器生成的副本赋值运算符。例如,以下代码行为通常是可取的,但不起作用。
A obj1;
// ...
A obj2;
// make changes to 'obj2'
// Update 'obj1' with the changes from 'obj2'
obj1 = obj2; // This copy doesn't work!
更多信息:
- 我应该更喜欢成员数据中的指针还是引用?
- 具有引用类成员的赋值运算符
- Thinking in C++, 2nd ed. Volume 1 ©2000 by Bruce Eckel, 11: References & the Copy-Constructor
使用引用时有某些规则:
- 引用必须在创建时初始化。(指针可以随时初始化。
- 一旦引用初始化为对象,就无法将其更改为引用另一个对象。(指针可以随时指向另一个对象。
- 不能有空引用。您必须始终能够假定引用已连接到合法的存储。
也许可以实现自定义赋值运算符,但这需要更多的代码来维护(即我认为这是另一个缺点)。
#include <iostream>
class A
{
private:
int a;
public:
explicit A(int value) : a(value) {}
A& operator=(const A& other)
{
a = other.a;
return *this;
}
const int& ref = a;
};
int main()
{
A obj1(10);
std::cout << "1: " << obj1.ref << "n";
A obj2(20);
std::cout << "2: " << obj2.ref << "n";
obj1 = obj2;
std::cout << "1: " << obj1.ref << "n";
return 0;
}
解决此问题的惯用方法是使用正确的访问器函数。
class A {
private:
int a;
public:
int getA() const { return a; }
};
在 C++ 中执行此操作的标准方法是使实际成员private
,但为接口包含一个公共的"getter"方法,如下所示:
class A{
private:
int a;
public:
int get_a() const { return a; }
A() : a(20) {}
};
int main() {
A obj;
int n = obj.get_a(); // n = 20
return 0;
}
用户无法设置 A::a
的值,但可以使用 A::get_a
检索其值。
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 在C++/Linux中设置单调时钟的一些技巧
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 嵌套在类中时无法设置成员数据
- 需要帮助设置在C++中使用的Potrace
- 如何在自删除后将对象设置为nullptr
- 将指针设置为"nullptr"并不能防止双重删除?
- 如何在Ubuntu中使用cmake设置qt4
- ld:bind_at_load和-bitcode_bundle(Xcode设置ENABLE_bitcode=YES)不能
- 如何在boost beast http请求中设置http头
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 为什么文件名被设置为一个点,而不是在读取矢量中的文件名时
- C++可以从类中设置的只读结构
- 如何将只读动态设置为按钮和文本框
- QtableView 将整行设置为只读
- 将公共成员设置为只读
- 如何将u盘设置为只读状态
- 将堆内存设置为只读
- Qt/Qml:自定义小部件 -- 无法设置"width"属性,因为它是只读的