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
}

必要なのは、これら 3 つの関数が CameraAcquisition クラスのメンバーにアクセスすることです。それを行う方法はありますか?任意の提案をいただければ幸いです。皆さん、ありがとうございました

EDIT 申し訳ありませんが、ここで重要な情報を忘れていました。ソース ファイルでは、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

オブジェクトのプライベート メンバーにアクセスする必要はありません。外部コードがプライベート メンバー変数に影響を与えるために使用できるパブリック ゲッター/セッター メンバー関数を提供することを検討してください。

または、サポート関数をクラスのメンバーにして、プライベート メンバーに自動的にアクセスできるようにすることもできます。

本当にプライベート メンバーにアクセスしたい場合は、friendキーワードを使用して、別のクラスまたは関数を現在のクラスのフレンドとして宣言できます。

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

ここでは、クラスB(つまり、そのメンバー関数) とフリー関数の両方fがアクセスできますA::a

于 2012-05-15T14:30:37.253 に答える
0

クラス定義に追加することで、いつでも友達として宣言できます。

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

CameraAcquisition クラスでゲッターを使用する

すなわち

CVSize getSize() { return size; }

CvCapture* getDevice { return device; }

等...

于 2012-05-15T14:30:46.397 に答える