C ++ - 从类外部访问类的私有成员

时间:2012-05-15 14:28:17

标签: c++ private scoping

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

我有一个.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类的成员。有什么办法吗?任何建议将不胜感激。谢谢大家

EDIT 对不起,我在这里忘了一条重要的信息。在源文件中,findBall()必须调用这些方法。我定义了这些方法以使代码更容易阅读。我无法在类定义中声明这些方法,因为我不想导出它们。 如果我在“私有”块中声明它们一切正常,但可能它不正确(我没有看到提供带有私有方法的头文件的重点。

5 个答案:

答案 0 :(得分:2)

如果这些成员被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

实际上,这是符合标准的。

答案 1 :(得分:2)

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

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

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

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

此处,B类(即其成员函数)和自由函数f均可访问A::a

答案 2 :(得分:0)

在CameraAcquisition类中使用getter

CVSize getSize() { return size; }

CvCapture* getDevice { return device; }

等...

答案 3 :(得分:0)

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

friend IplImage * ::grabFrame();

答案 4 :(得分: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.
    */
}

如果还有另一个变量,请说类型y的{​​{1}}。
现在,要访问y,我们必须计算它与对象基点的偏移量。

通常,数据按照声明的顺序存储。
同样,在类中的数据类型异构的情况下,也要考虑结构填充。 我建议您深入阅读struct padding。

我们可以将y设为

DATATYPE