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

你不能。该成员是私有的,在课堂外不可见。这就是 public/protected/private 修饰符的全部意义。

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

于 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 编辑之前的部分,我把它留在这里是为了>那些想要理解一些概念而不仅仅是寻找>问题的答案的人。


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

源代码示例:

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 多年的经验,但我发现它很棘手。

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

我确信方法可以简化,而且我确信还有其他方法。我不是为 OP 发布这个,因为它已经 5 个月了,但希望这对未来的谷歌用户有用。

于 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

可以直接在 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 回答
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 回答
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

access private members outside class ....only for study purpose .... This program accepts all the below conditions "I dont want to create member function for above class A. And also i dont want to inherit the above class A. I dont want to change the specifier of iData."

//here member function is used only to input and output the private values ... //void hack() is defined outside the class...

//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 回答