19

私はclass A以下のように持っています:-

class A{
     int iData;
};

class Aメンバー関数を作成したり、上記を継承したり、の指定子を変更したりしたくありませんiData

私の疑問:-

  • iDataオブジェクトにアクセスする方法は、どのobj1インスタンスであるかを言いますclass Aか?
  • iDataオブジェクトのを変更または操作する方法はobj1

:は使用しないでくださいfriend

4

12 に答える 12

36

これが方法ですが、お勧めしません

class Weak {
private:
    string name;

public:
    void setName(const string& name) {
        this->name = name;
    }

    string getName()const {
        return this->name;
    }

};

struct Hacker {
    string name;
};

int main(int argc, char** argv) {

    Weak w;
    w.setName("Jon");
    cout << w.getName() << endl;
    Hacker *hackit = reinterpret_cast<Hacker *>(&w);
    hackit->name = "Jack";
    cout << w.getName() << endl;

}
于 2011-11-27T00:10:54.667 に答える
12

できません。そのメンバーはプライベートであり、クラスの外には表示されません。これが、パブリック/保護/プライベート修飾子の要点です。

(ただし、ダーティポインターのトリックを使用することもできますが、未定義の動作領域にかなり速く入ると思います。)

于 2011-07-16T11:57:21.793 に答える
12

悪い考えです、決してそれをしないでください-しかし、ここにそれがどのように行われることができるかがあります:

int main()
{
   A aObj;
   int* ptr;

   ptr = (int*)&aObj;

   // MODIFY!
   *ptr = 100;
}
于 2011-07-16T11:59:30.303 に答える
11

編集:
あなたが友達を使いたくないと言うように質問を編集したのを見たばかりです。
次に、答えは次のとおりです。

いいえ、できません。少なくとも、C++標準で承認された移植可能な方法ではありません。


回答の後半はQ編集の前でした。質問への回答を探すだけでなく、いくつかの概念を理解したい人のために、ここに残しておきます。


プライベートアクセス指定子の下にメンバーがいる場合、それらのメンバーにはクラス内からのみアクセスできます。外部からのアクセスは許可されていません。

ソースコードの例:

class MyClass
{
    private:
        int c;
    public:
    void doSomething()
    {
        c = 10;    //Allowed 
    }
};

int main()
{
    MyClass obj;
    obj.c = 30;     //Not Allowed, gives compiler error
    obj.doSomething();  //Allowed
}

回避策:friendレスキュー
プライベートメンバーにアクセスするには、その特定のクラスのフレンドとして関数/クラスを宣言すると、アクセス指定子チェックなしでその関数またはクラスオブジェクト内でメンバーにアクセスできるようになります。

変更されたコードサンプル:

class MyClass
{
    private:
        int c;

    public:
    void doSomething()
    {
        c = 10;    //Allowed 
    }

    friend void MytrustedFriend();    
};

void MytrustedFriend()
{
        MyClass obj;
        obj.c = 10; //Allowed
}

int main()
{
    MyClass obj;
    obj.c = 30;     //Not Allowed, gives compiler error
    obj.doSomething();  //Allowed
    //Call the friend function
    MytrustedFriend();
    return 0;
}
于 2011-07-16T11:58:42.633 に答える
8

http://bloglitb.blogspot.com/2010/07/access-to-private-members-thats-easy.html

この男のブログは、テンプレートを使用してそれを行う方法を示しています。いくつかの変更を加えると、この方法をプライベートデータメンバーにアクセスするように適合させることができますが、10年以上の経験があるにもかかわらず難しいと思いました。

他の皆と同じように、これを行うことが合法であるケースは非常に少ないことを指摘したいと思います。ただし、1つ指摘したいのは、ソフトウェアスイートの単体テストを作成していたことです。連邦規制当局は、元のコードを変更せずに、コードのすべての行を実行およびテストすることを要求しています。(IMHO)の設計が不十分なため、静的定数は「プライベート」セクションにありましたが、単体テストで使用する必要がありました。ですから、この方法は私にはそれを行うための最良の方法のように思えました。

方法を単純化できると確信していますし、他の方法もあると確信しています。5か月が経過しているため、これをOPに投稿することはしませんが、将来のgooglerに役立つことを願っています。

于 2011-11-15T20:45:27.237 に答える
4

C ++では、ほとんどすべてが可能です。個人データを取得する方法がない場合は、ハッキングする必要があります。テストのためだけにそれをしてください!

class A {
     int iData;
};

int main ()
{
    A a;
    struct ATwin { int pubData; }; // define a twin class with public members
    reinterpret_cast<ATwin*>( &a )->pubData = 42; // set or get value

    return 0;
}
于 2013-03-14T16:12:40.673 に答える
3

あなたがそれをすることができる合法的な方法はありません。

于 2011-07-16T11:59:48.023 に答える
2

friendの作成を開始しclass Aます。例えば

void foo ();

class A{
  int iData;
  friend void foo ();
};

編集

class A体を変えることができない場合A::iDataは、質問の特定の条件でアクセスできません。

于 2011-07-16T11:58:19.400 に答える
2

iDataprivateクラスのメンバーです。現在、この単語privateは、C ++でも実際の生活でも、非常に明確な意味を持っています。それはあなたがそれに触れることができないことを意味します。それは推奨ではなく、法律です。クラス宣言を変更しない場合、そのメンバーをいかなる方法、形状、形式でも操作することはできません。

于 2011-07-16T12:14:57.700 に答える
2

mainおよびotherの関数でクラスのプライベートデータに直接アクセスすることが可能です...

ここに小さなコードがあります...

class GIFT
{
    int i,j,k;

public:
    void Fun() 
    {
        cout<< i<<" "<< j<<" "<< k;
    }

};

int main()
{
     GIFT *obj=new GIFT(); // the value of i,j,k is 0
     int *ptr=(int *)obj;
     *ptr=10;
     cout<<*ptr;      // you also print value of I
     ptr++;
     *ptr=15;
     cout<<*ptr;      // you also print value of J
     ptr++;
     *ptr=20; 
     cout<<*ptr;      // you also print value of K
     obj->Fun();
}
于 2013-04-23T04:47:46.357 に答える
1

友達はあなたの友達です。

class A{
    friend void foo(A arg);
    int iData;
};

void foo(A arg){
     // can access a.iData here
}

これを定期的に行っている場合は、おそらくデザインを再検討する必要があります。

于 2011-07-16T11:56:53.287 に答える
-1

クラス外のプライベートメンバーにアクセスする....学習目的でのみ....このプログラムは、以下のすべての条件を受け入れます。「上記のクラスAのメンバー関数を作成したくない。また、上記のクラスAを継承したくない。I iDataの指定子を変更したくない。」

//ここで、メンバー関数はプライベート値の入力と出力にのみ使用されます... // void hack()はクラスの外部で定義されています...

//GEEK MODE....;)
#include<iostream.h>
#include<conio.h>

    class A
    {
    private :int iData,x;
    public: void get()             //enter the values
        {cout<<"Enter iData : ";
            cin>>iData;cout<<"Enter x : ";cin>>x;}

        void put()                               //displaying values
    {cout<<endl<<"sum = "<<iData+x;}
};

void hack();        //hacking function

void main()
{A obj;clrscr();
obj.get();obj.put();hack();obj.put();getch();
}

void hack()         //hack begins
{int hck,*ptr=&hck;
cout<<endl<<"Enter value of private data (iData or x) : ";
cin>>hck;     //enter the value assigned for iData or x
for(int i=0;i<5;i++)
{ptr++;
if(*ptr==hck)
{cout<<"Private data hacked...!!!\nChange the value : ";
cin>>*ptr;cout<<hck<<" Is chaged to : "<<*ptr;
return;}
}cout<<"Sorry value not found.....";
}
于 2016-09-18T17:24:40.670 に答える