[英]C++ - Access private members of class from outside the class
我想知道是否有任何方法可以从课外访问班级的私人成员。 我会解释我的问题。
我有一个.hpp文件,其中包含类的定义及其私有成员和公共函数(这是我唯一要导出的函数)。 在相应的.cpp中,我必须使用一些“支持”函数,它需要访问.hpp中定义的类的私有成员。
这是我的代码的一部分:
--- .hpp ---
namespace vision {
class CameraAcquisition {
/* MEMBERS */
CvSize size;
CvCapture *device;
CvScalar hsv_min,hsv_min2,hsv_max,hsv_max2;
/* METHODS */
public:
CameraAcquisition();
~CameraAcquisition();
int findBall();
};
}
--- .cpp ---
#include "CameraAcquisition.hpp"
using namespace vision;
IplImage *grabFrame() {
// code here
}
IplImage *convertToHSV(IplImage *origin) {
// code here
}
IplImage *calculateThresholdedImage(IplImage *converted) {
// code here
}
我需要的是这三个函数访问CameraAcquisition类的成员。 有什么办法吗? 任何建议将不胜感激。 谢谢你们
编辑对不起,我在这里忘了一条重要的信息。 在源文件中,findBall()必须调用这些方法。 我定义了这些方法以使代码更容易阅读。 我无法在类定义中声明这些方法,因为我不想导出它们。 如果我在一个“私有”块中声明它们一切正常,但也许它不正确(我没有看到提供带有私有方法的头文件的重点。
如果这些成员是private
,你需要访问它们,那你就做错了,所以我的建议是你没有 。
现在让我们认真对待 - 有一些方法 - 免责声明:并非所有都安全或便携或保证工作:
1) 预处理程序滥用
#define class struct
#define private public
#include "CameraAcquisition.h"
#undef class
#undef private
2) 假班
class MyCameraAcquisition {
public: //<--- public in your class
/* MEMBERS */
CvSize size;
CvCapture *device;
CvScalar hsv_min,hsv_min2,hsv_max,hsv_max2;
/* METHODS */
public:
CameraAcquisition();
~CameraAcquisition();
int findBall();
};
CameraAcquisition prvt;
MyCameraAcquisition publ = (MyCameraAcquisition&) prvt;
3)litb发布的模板滥用 - http://bloglitb.blogspot.com/2010/07/access-to-private-members-thats-easy.html
实际上,这是符合标准的。
你不应该想访问对象的私有mebers。 考虑提供外部代码可用于影响私有成员变量的公共getter / setter成员函数
或者,您可以使您的支持功能成为该类的成员,因此它可以自动访问私有成员。
如果您确实想要访问私有成员,可以使用friend
关键字将另一个类或函数声明为当前类的朋友
class A
{
int a; // private
friend class B;
friend void f(A*);
};
这里B
类(即其成员函数)和自由函数f
都可以访问A::a
在CameraAcquisition类中使用getter
即
CVSize getSize() { return size; }
CvCapture* getDevice { return device; }
等等...
您可以通过添加类定义将它们声明为朋友:
friend IplImage * ::grabFrame();
使用的编译器是Visual Studio 2015
不推荐使用此方法,但有效。
让我们考虑下课
class mydata
{
private:
int x;
public:
mydata(int no)
{
x=no;
}
}
只有数据成员存储在类对象中。 现在我可以使用以下功能访问x
。 我知道class mydata
只有一个变量,它必须是int x
。
int getx(mydata *d)
{
return ((int*)d)[0];
/*
How did this work?
-> d is pointing to the mydata object.
as I typecasted it to int* it will be considered as int array.
Of that array (which has lenght 1) access the first element.
*/
}
如果有另一个变量可以说y
类型DATATYPE
。
现在,要访问y,我们必须计算它与对象基础的偏移量。
通常,数据的存储顺序与您声明的顺序相同。
此外,在类中的异构数据类型的情况下,还要考虑结构填充。 我想建议你深入阅读struct padding。
我们可以得到y
myclass *ptr =new myclass();
int offset_y=//whatever offset of y in number of bytes from base of object of perticular class;
char *byte_ptr_y=((char*)ptr)[offset_y];
DATATYPE y=*((DATATYPE*)byte_ptr_y);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.