4

C++でクラスのプライベートメンバーにアクセスすることは可能ですか?

フレンド関数がなく、クラス定義にアクセスできない場合

4

4 に答える 4

8

アクセスを取得するためにポインタ演算を使用することを意味しますか?それは可能ですが、間違いなく危険です。この質問も見てください:プライベートメンバーへのアクセス

于 2009-04-08T10:23:31.720 に答える
6

私はこのようないくつかの古い学校のトリックがあったと思います:

#define private public
#include "header.h"
#define private private

しかし、これを行うことは強くお勧めしません(C ++標準でこれについて何か言ったことをすぐに読みました)-このグーグルについて「#defineprivatepublic」についてもっと読みたい場合

于 2009-04-08T11:08:40.520 に答える
2

たとえそれが厄介なハックによって可能だったとしても - 以前の投稿を参照してください - あなたはそれをすべきではありません.

カプセル化は非常に適切な目的のために存在し、クラス メンバーをプライベートとして設定することは、開発者がそのメンバーをいじるつもりがなかったことを意味します。それは意味するはずです

「パブリック インターフェイスを意図した範囲で使用するために、このメンバーにアクセスする必要はありません」

于 2009-04-08T13:19:56.057 に答える
2

うーん、私はばかげているかもしれませんが、変更したいクラスと同じメンバーで異なる public/private 修飾子を持つ「ツイン」クラスを定義してから、reintepret_cast を使用して元のクラスを自分のクラスにキャストすることができると思います。プライベート メンバーにアクセスできます。

その少しハック;-)

アイデアを説明するためのちょっとしたコード:

class ClassWithNoAccess 
{
public:
  someMethod();

private:
  int someVar;
};

class ClassTwin 
{
public:
  someMethod();

public:
  int someVar;
}

そしてコードのどこかに:

ClassWithNoAccess* noAccess = new ClassWithNoAccess();
ClassTwin* twin = reinterpret_cast<ClassTwin *>(noAccess);
twin->someVar = 1;

編集:誰かが以前に書いたように、これはうまくいくかもしれませんが、標準はパブリック修飾子とプライベート修飾子を持つ変数の順序が同じであることを保証しません

于 2009-04-08T11:05:47.967 に答える