簡體   English   中英

C ++ - 從類外部訪問類的私有成員

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM