3

我想知道是否有任何方法可以从班级外部访问班级的私人成员。我会解释我的问题。

我有一个 .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() 必须调用这些方法。我定义了这些方法以使代码更易于阅读。我不能在类定义中声明这些方法,因为我不想导出它们。如果我在“私有”块中声明它们一切正常,但可能不正确(我看不出提供带有私有方法的头文件的意义。

4

5 回答 5

3

如果创建了这些成员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

实际上,令人惊讶的是,这个是符合标准的。

于 2012-05-15T14:29:31.130 回答
2

您不应该想要访问对象的私有成员。考虑提供外部代码可以用来影响私有成员变量的公共 getter/setter 成员函数

或者,您可以使您的支持函数成为该类的成员,因此它可以自动访问私有成员。

如果你真的想访问私有成员,你可以使用friend关键字将另一个类或函数声明为当前类的朋友

class A
{
  int a; // private
  friend class B;
  friend void f(A*);
};

这里类B(即它的成员函数)和自由函数f都可以访问A::a

于 2012-05-15T14:30:37.253 回答
0

在 CameraAcquisition 类中使用 getter

IE

CVSize getSize() { return size; }

CvCapture* getDevice { return device; }

ETC...

于 2012-05-15T14:30:46.397 回答
0

您总是可以通过添加类定义将它们声明为朋友:

friend IplImage * ::grabFrame();
于 2012-05-15T14:32:10.280 回答
0

使用的编译器是 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.
    */
}

如果还有另一个变量,可以说ytype 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);
于 2018-07-27T17:51:11.263 回答