如何在没有“朋友”的情况下访问课外的私人数据成员?

时间:2011-07-16 11:54:46

标签: c++ class private encapsulation data-members

我有class A,如下所述: -

class A{
     int iData;
};

我既不想创建成员函数也不继承上述class A,也不想更改iData的说明符。

我的疑惑: -

  • 如何访问对象iData,说obj1class A的实例?
  • 如何更改或操纵对象iData的{​​{1}}?

注意:请勿使用obj1

12 个答案:

答案 0 :(得分:18)

这是一种方法,不推荐使用

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;

}

答案 1 :(得分:10)


  

修改
  刚刚看到你编辑了这个问题,说你不想使用朋友   然后答案是:

不,你不能,至少不是以C ++标准批准的便携方式。


  

答案的后半部分是Q编辑和之前的部分。我把它留在这里是为了那些想要理解一些概念的人。不只是回答&gt;问题。


如果您拥有私有访问说明符下的成员,则只能从该类中访问这些成员。不允许外部访问。

源代码示例:

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

答案 2 :(得分:9)

糟糕的主意,不要永远这样做 - 但在这里它是如何做到的:

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

   ptr = (int*)&aObj;

   // MODIFY!
   *ptr = 100;
}

答案 3 :(得分:8)

你做不到。该成员是私人的,在课堂外不可见。这就是public / protected / private修饰符的重点。

(你可能会使用脏指针技巧,但我猜你会很快进入未定义的行为领域。)

答案 4 :(得分:7)

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

这家伙的博客向您展示了如何使用模板进行操作。通过一些修改,您可以调整此方法来访问私有数据成员,尽管我发现它很棘手,尽管有10年以上的经验。

我想像其他人一样指出,只有极少数情况下这样做是合法的。但是,我想指出一个:我正在为软件套件编写单元测试。联邦监管机构要求每一行代码都要行使和测试,不用修改原始代码。由于(恕我直言)设计不佳,静态常量在“私人”部分,但我需要在单元测试中使用它。所以这种方法在我看来是最好的方法。

我确信这种方式可以简化,我确信还有其他方法。我不会为OP发布这个,因为它已经有5个月了,但希望这对未来的Google员工有用。

答案 5 :(得分:3)

没有合法的方法可以做到。

答案 6 :(得分:3)

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

答案 7 :(得分:2)

friend是你的朋友。

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

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

如果你经常这样做,你应该重新考虑你的设计。

答案 8 :(得分:2)

开始制作friend的{​​{1}}。 e.g。

class A

修改

如果您无法更改void foo (); class A{ int iData; friend void foo (); }; 正文,则无法使用您问题中的指定条件访问class A

答案 9 :(得分:2)

iData是该班级的private成员。现在,private这个词在C ++和现实生活中都具有非常明确的含义。这意味着你无法触摸它。这不是推荐,而是法律。如果您不更改类声明,则不允许您以任何方式,形状或形式操纵该成员。

答案 10 :(得分:2)

可以直接在main和其他函数中访问类的私有数据......

这是一个小代码......

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();
}

答案 11 :(得分:-1)

访问课堂外的私人成员....仅供学习目的.... 该计划接受以下所有条件 &#34;我不想为上面的A类创建成员函数。而且我也不想继承上面的类A.我不想更改iData的说明符。&#34;

//这里的成员函数仅用于输入和输出私有值... // 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.....";
}