C++ - 从类外部访问类的私有成员
C++ - Access private members of class from outside the class
我想知道是否有任何方法可以从类外部访问类的私有成员。我会解释我的问题。
我有一个.hpp文件,其中包含类的定义及其私有成员和公共函数(这是我唯一想导出的函数(。在相应的.cpp中,我必须使用一些"支持"函数,该函数需要访问.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 到私人会员 - 这很容易.html
实际上,令人惊讶的是,这是符合标准的。
您不应该想要访问对象的私有 meber。 考虑提供公共 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,我们必须计算它与对象底部的偏移量。
存储顺序与您声明数据的顺序相同。
此外,在类中存在异构数据类型的情况下,还需要考虑结构填充。我想建议您深入阅读结构填充。
我们可以得到 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);
- 在 C++ 中从类外部修改类的成员
- 用作默认参数的静态成员会导致无法解析的外部
- 使用静态 constexpr 成员的未解析外部符号
- 具有外部定义的默认特殊成员函数
- DLL+导出类+模板成员func=未解析的外部符号.任何修复的机会
- 从类C++外部调用指向成员方法的成员指针
- 在成员函数外部封闭类的定义中需要默认成员初始值设定项
- 作为成员的静态类模板实例会导致未解析的外部符号错误
- 为什么在类外部(但在头文件中)定义的类成员函数必须内联?
- LNK2001 SHA3 类成员的未解析外部符号
- 从内部类访问外部公共成员
- 在类外部初始化的 constexpr 静态成员的声明中是否需要 constexpr 说明符
- 类的成员函数,具有类外部的模板参数和默认参数
- 从不同的标头访问外部结构成员
- 访问说明符外部的 C++ 类成员
- (C++)(链接错误)模板成员函数上未解析的外部
- 是否有一种方法可以让公共成员在班级外部无法解码,而无需访问包装器功能
- 为什么私有继承对象允许成员函数将派生的*转换为基*,而外部不能
- 成员静态回调函数的外部"C"
- LNK 2001 未解析的外部在 NPPluginFuncs 结构 ptr 作为静态类成员