C++ Qt类的私有部分不安全

C++ Qt类的私有部分不安全,c++,qt,class,private-members,C++,Qt,Class,Private Members,我已经在Qt中将QByteArray类定义为arr实例。通常情况下,QByteArrayand和其他类的私有成员是不可访问的,否则在类中使用朋友成员 请注意下面的代码: void Widget::onBtnRun() { QByteArray arr; arr = "this is a test"; arr.d->size = 5; // stop with compile error-> QByteArray::d is p

我已经在Qt中将QByteArray类定义为arr实例。通常情况下,QByteArrayand和其他类的私有成员是不可访问的,否则在类中使用朋友成员

请注意下面的代码:

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成员是私有的,无法访问该成员

但我已经编辑了QByteArray头文件,所以在它的类部分添加了下面的行,然后再次保存

public :
     friend Class Widget;
现在我可以在Widget类中访问QByteArray类的私有成员,没有任何问题:

void Widget::onBtnRun()
{
    QByteArray arr;
    arr = "ABCDEFGHIJKLMNOPQRSTUV";
    arr.d->size = 5;
    QMessageBox::information(this, "", arr);
}
MessageBox输出现在是ABCDE

这是不是缺少课程?也许这个原因在将来会出现很大的问题。 如何将私人成员从ASE问题中解救出来

提前谢谢

我认为没有办法做到这一点。如果有人可以访问你的头文件,他可能会对你的类做任何事情。如果您正在开发一个简单的可执行应用程序,您不应该担心这一点,因为其他用户无法访问您的源文件。对于库,您可以使其动态,并仅提供.so/.dll文件


如果你编辑某人的头文件,你将自行承担风险。

< P> C++中的类成员访问修饰符与安全无关。它们用于表达编译器强制执行的设计意图。它们不用于隐藏/混淆代码或阻止第三方访问

引述:

通常,访问控制名称或符号,而不是底层实体。访问私人成员的方式有很多,而且一直都是这样;您不能使用此类成员的名称


为什么你认为这是个问题?您试图保护自己/您的代码不受什么影响?

您的意思是什么问题?也许更干净的方法是为私有成员编写一个getter,我不认为这是一个问题。由于您正在编辑头文件,您最好将私有成员公开。是的,受保护的成员无法访问,否则将无法访问继承的类。