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);
}

QByteArrayd 成员是 private,无法访问它!

但我已经编辑了 QByteArray header 文件,所以在 class 部分添加下面一行,然后再次保存。

public :
     friend Class Widget;

现在我可以访问 Widget classQByteArray classprivate 成员,没有任何问题:

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 编码?