Qt 类 的私有部分不安全
private section of Qt classes is not safe
我在 Qt 中定义了一个 QByteArray
class
作为 arr
实例。通常,QByteArray
(和另一个 classes
)的 private
成员不可访问,否则使用 class
.
中的 friend
成员
注意下面的代码:
void Widget::onBtnRun()
{
QByteArray arr;
arr = "this is a test";
arr.d->size = 5; // stop with compile error-> QByteArray::d is private
QMessageBox::information(this, "", arr);
}
QByteArray
的 d
成员是 private
,无法访问它!
但我已经编辑了 QByteArray
header
文件,所以在 class 部分添加下面一行,然后再次保存。
public :
friend Class Widget;
现在我可以访问 Widget
class
中 QByteArray
class
的 private
成员,没有任何问题:
void Widget::onBtnRun()
{
QByteArray arr;
arr = "ABCDEFGHIJKLMNOPQRSTUV";
arr.d->size = 5;
QMessageBox::information(this, "", arr);
}
MessageBox
输出现在是 "ABCDE"
.
这是 classes
的不足吗?也许这个原因在未来会出现很大的问题。
如何让 private
成员免于这些问题?
提前致谢!
我认为没办法这样做。如果有人可以访问您的头文件,他可能会对您的 class 做任何事情。如果您正在开发一个简单的可执行应用程序,您不必担心这一点,因为其他用户无法 访问您的源文件。如果是库,您可以使其动态化并仅提供 .so/.dll 文件。
如果您编辑某人的头文件,您将自担风险。
C++ 中的 class 成员访问修饰符与安全无关。它们的存在是为了表达编译器强制执行的设计意图。它们不用于"hide"/混淆代码或防止第三方访问。
引用 this excellent answer:
In general, access controls names or symbols, not the underlying entities. There are, and always have been, numerous ways of accessing private members; what you cannot do is use the name of such a member.
您为什么认为这是一个问题?您要从什么地方 "protect" yourself/your 编码?
我在 Qt 中定义了一个 QByteArray
class
作为 arr
实例。通常,QByteArray
(和另一个 classes
)的 private
成员不可访问,否则使用 class
.
friend
成员
注意下面的代码:
void Widget::onBtnRun()
{
QByteArray arr;
arr = "this is a test";
arr.d->size = 5; // stop with compile error-> QByteArray::d is private
QMessageBox::information(this, "", arr);
}
QByteArray
的 d
成员是 private
,无法访问它!
但我已经编辑了 QByteArray
header
文件,所以在 class 部分添加下面一行,然后再次保存。
public :
friend Class Widget;
现在我可以访问 Widget
class
中 QByteArray
class
的 private
成员,没有任何问题:
void Widget::onBtnRun()
{
QByteArray arr;
arr = "ABCDEFGHIJKLMNOPQRSTUV";
arr.d->size = 5;
QMessageBox::information(this, "", arr);
}
MessageBox
输出现在是 "ABCDE"
.
这是 classes
的不足吗?也许这个原因在未来会出现很大的问题。
如何让 private
成员免于这些问题?
提前致谢!
我认为没办法这样做。如果有人可以访问您的头文件,他可能会对您的 class 做任何事情。如果您正在开发一个简单的可执行应用程序,您不必担心这一点,因为其他用户无法 访问您的源文件。如果是库,您可以使其动态化并仅提供 .so/.dll 文件。
如果您编辑某人的头文件,您将自担风险。
C++ 中的 class 成员访问修饰符与安全无关。它们的存在是为了表达编译器强制执行的设计意图。它们不用于"hide"/混淆代码或防止第三方访问。
引用 this excellent answer:
In general, access controls names or symbols, not the underlying entities. There are, and always have been, numerous ways of accessing private members; what you cannot do is use the name of such a member.
您为什么认为这是一个问题?您要从什么地方 "protect" yourself/your 编码?