我有一个class A
如下所述: -
class A{
int iData;
};
我既不想创建成员函数,也不想继承上述内容,class A
也不想更改iData
.
我的疑问:-
- 如何访问
iData
一个对象说obj1
哪个是一个实例class A
? - 如何改变或操纵
iData
一个对象obj1
?
注意:不要使用friend
.
我有一个class A
如下所述: -
class A{
int iData;
};
我既不想创建成员函数,也不想继承上述内容,class A
也不想更改iData
.
我的疑问:-
iData
一个对象说obj1
哪个是一个实例class A
?iData
一个对象obj1
?注意:不要使用friend
.
这是一种方法,但不推荐
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;
}
你不能。该成员是私有的,在课堂外不可见。这就是 public/protected/private 修饰符的全部意义。
(虽然你可能会使用脏指针技巧,但我猜你会很快进入未定义的行为领域。)
坏主意,永远不要这样做 - 但这是可以做到的:
int main()
{
A aObj;
int* ptr;
ptr = (int*)&aObj;
// MODIFY!
*ptr = 100;
}
编辑:
刚刚看到您编辑了问题,说您不想使用朋友。
那么答案是:
不,你不能,至少不能以 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;
}
http://bloglitb.blogspot.com/2010/07/access-to-private-members-thats-easy.html
这个人的博客向您展示了如何使用模板来做到这一点。通过一些修改,您可以调整此方法以访问私有数据成员,尽管尽管我有 10 多年的经验,但我发现它很棘手。
我想像其他人一样指出,在极少数情况下这样做是合法的。但是,我想指出一个:我正在为软件套件编写单元测试。联邦监管机构要求在不修改原始代码的情况下运行和测试每一行代码。由于(恕我直言)糟糕的设计,静态常量位于“私有”部分,但我需要在单元测试中使用它。所以在我看来,这种方法是最好的方法。
我确信方法可以简化,而且我确信还有其他方法。我不是为 OP 发布这个,因为它已经 5 个月了,但希望这对未来的谷歌用户有用。
在 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;
}
没有合法的方法可以做到这一点。
可以直接在 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();
}
开始制作friend
. class A
例如
void foo ();
class A{
int iData;
friend void foo ();
};
编辑:
如果您无法更改class A
正文,则A::iData
无法通过问题中的给定条件访问。
iData
是private
班级的一员。现在,这个词private
在 C++ 和现实生活中都有非常明确的含义。这意味着你不能碰它。这不是建议,而是法律。如果您不更改类声明,则不允许以任何方式、形状或形式操作该成员。
朋友是你的朋友。
class A{
friend void foo(A arg);
int iData;
};
void foo(A arg){
// can access a.iData here
}
如果你经常这样做,你可能应该重新考虑你的设计。
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.....";
}