【问题标题】:Friend function undeclared identifiers朋友函数未声明的标识符
【发布时间】:2013-08-27 19:55:05
【问题描述】:

我正在使用 OpenCV 和 Qt 5。我需要将鼠标回调传递给命名窗口以完成我正在做的一些工作。但是,我无法让它看到我班级的任何私有成员变量。

这里有一些代码:

class testWizard : public QWizard
{
  Q_OBJECT


  public:
   testWizard();
  ~testWizard();

   friend void mouseHandler(int, int, int, void*);



   private:

    cv::Mat preview;

    bool drag; 
    cv::Rect rect;   
};

好友功能:

void mouseHandler(int event, int x, int y, void* param)
{

 cv::Point p1, p2;

 if(event == CV_EVENT_LBUTTONDOWN && !drag)
 {
   p1 = cv::Point(x,y);
   drag = true;
 }

 if(event == CV_EVENT_LBUTTONDOWN && drag)
 {
   cv::Mat temp;
   preview.copyTo(temp);
 }

}

我不知道我做错了什么。我很确定这是声明这一点的正确方法。它告诉我预览和拖动是未声明的标识符。不幸的是,我需要这样做,因为我需要访问私有成员并且由于隐藏了 this 参数而无法传递指向成员函数的指针。

有人可以帮忙吗?谢谢!

【问题讨论】:

    标签: c++ qt opencv friend friend-function


    【解决方案1】:

    使用friend 声明,您的函数将可以访问testWizard 对象的成员。但是,您仍然需要提供对象或指向此类对象的指针才能访问变量:

    testWizard* wizard = getTestWizard(); // no idea how to do that
    if(event == CV_EVENT_LBUTTONDOWN && !wizard->drag) { ... }
    

    【讨论】:

    • 啊,是的,谢谢。您是否需要有一个不带参数的构造函数,或者您可以使用任何构造函数类型吗?
    • @John:我不知道这个框架是怎么用的!您可以将指向testWizard 的指针作为param 参数传递,或者您可以注册一个包含指向该对象的指针的函数对象,而不是注册一个函数指针。你当然不想构造一个testWizard,因为它没有任何特定的价值。
    猜你喜欢
    • 1970-01-01
    • 2014-09-28
    • 1970-01-01
    • 2013-08-19
    • 1970-01-01
    • 2012-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多