我有class A
,如下所述: -
class A{
int iData;
};
我既不想创建成员函数也不继承上述class A
,也不想更改iData
的说明符。
我的疑惑: -
iData
,说obj1
是class A
的实例?iData
的{{1}}? 注意:请勿使用obj1
。
答案 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.....";
}