web-dev-qa-db-ja.com

「友人」を作成せずにクラス外の個人データメンバーにアクセスする方法

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

class A{
     int iData;
};

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

私の疑問:-

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

friendを使用しないでください。

15
Abhineet

できません。そのメンバーはプライベートであり、クラスの外部からは見えません。これがpublic/protected/private修飾子の重要なポイントです。

(おそらくダーティポインタートリックを使用することもできますが、私の推測では、未定義の動作領域に入るのはかなり早いでしょう。)

8
Mat

ここに方法がありますが、推奨されません

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;

}
20
Sleiman Jneidi

編集:
友達を使いたくないという質問を編集したのを見ただけです。
それから答えは:

できません、少なくとも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;
}
10
Alok Save

悪い考え、今までやってはいけない-しかし、ここではそれを行う方法です:

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

   ptr = (int*)&aObj;

   // MODIFY!
   *ptr = 100;
}
9
Ajay

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

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

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

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

7
Timmah

正当な方法はありません。

3
RocketR

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

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

2
n.m.

メインおよび他の機能でクラスのプライベートデータに直接アクセスすることが可能です...

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

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();
}
2
GIFT.azib

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

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

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

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

2
James

class Afriendsの作成を開始します。例えば.

void foo ();

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

編集

class A bodyを変更できない場合、質問の特定の条件ではA::iDataにアクセスできません。

2
iammilind