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

问题描述 投票:15回答:12

我有一个如下所述的class A: -

class A{
     int iData;
};

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

我的疑惑: -

  • 如何访问对象的iDataobj1class A的一个实例?
  • 如何改变或操纵物体iDataobj1

注意:不要使用friend

c++ class private encapsulation data-members
12个回答
8
投票

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

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


2
投票

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


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

-1
投票

访问类外的私有成员....仅用于学习目的....此程序接受以下所有条件“我不想为上面的类A创建成员函数。而且我也不想继承上面的类A.我不想改变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.....";
}

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;

}

10
投票

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

不,你不能,至少不是以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;
}

9
投票

不好的想法,不要永远这样做 - 但在这里它是如何做到的:

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

   ptr = (int*)&aObj;

   // MODIFY!
   *ptr = 100;
}

7
投票

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

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

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

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


3
投票

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


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

2
投票

friend是你的朋友。

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

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

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


2
投票

开始制作friendclass As。例如

void foo ();

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

编辑:

如果你不能改变class A身体,那么A::iData在您的问题中无法使用给定条件。

© www.soinside.com 2019 - 2024. All rights reserved.