2016-06-12 7 views
0

私はQByteArrayclassarrインスタンスとして定義しています。Qtです。通常、privateメンバーのQByteArray(および別のものはclasses)にアクセスできません。そうでない場合は、classfriendのメンバーを使用してください。Qtクラスのプライベートセクションは安全ではありません

注意怒鳴るコード:

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あるとそれにアクセスすることはできません!

しかし、私はQByteArrayheaderというファイルを編集していますので、そのクラスセクションに蛇行行を追加して、もう一度保存してください。

public : 
    friend Class Widget; 

そして今、私は何の問題もなく、WidgetclassQByteArrayclassprivateメンバーにアクセスすることができます。

void Widget::onBtnRun() 
{ 
    QByteArray arr; 
    arr = "ABCDEFGHIJKLMNOPQRSTUV"; 
    arr.d->size = 5; 
    QMessageBox::information(this, "", arr); 
} 

MessageBox出力は今"ABCDE"です。

classesはこれが欠けていますか?おそらくこの原因は将来的には非常に問題に見えます。 どのようにprivateメンバーがthease問題から救うことができますか?

ありがとうございます!

+0

どのような問題がありますか?たぶん、よりクリーンな方法は、プライベートメンバーのための 'getter'を書くことです – user463035818

+1

これはどのように問題ではないか分かりません。ヘッダーファイルを編集しているので、プライベートメンバーを公開することもできます。 – thuga

答えて

3

C++のクラスメンバーアクセス修飾子は、セキュリティとは関係ありません。コンパイラによって実施されるには、の高速設計意図があります。それらはではありません。は、コードを隠す/難読化する、または第三者によるアクセスを防止するために使用されます。 this excellent answerを引用

:一般的な、アクセス制御名や記号ではなく、根本的なエンティティで

。プライベートメンバーにアクセスするには、常にさまざまな方法があります。あなたができないことは、そのようなメンバーの名前を使用することです。

なぜこの問題が考えられますか?あなた自身/あなたのコードを "保護"しようとしているのは何ですか?

+0

はい、保護されたメンバーはアクセスできません。継承されたクラスにはアクセスできません。 –

3

私はとは思っていません。これを行うには。誰かがあなたのヘッダーファイルにアクセスできる場合、彼はあなたのクラスで何かをする可能性があります。単純な実行可能アプリケーションを開発している場合、他のユーザーがソースファイルにアクセスできないので、これについて心配する必要はありません。ライブラリの場合は、動的に作成し、.so/.dllファイルのみを提供することができます。

誰かのヘッダーファイルを編集する場合は、自身のリスクで行います。

関連する問題