想要一个静态成员函数来调用同一个类的成员变量

时间:2016-06-27 09:55:14

标签: c++ static-methods pointer-to-member

headerfile.h

class A
{
  cv::Mat depthimagemouse;
  std::string m_winname;

public:

  A(const std::string &winname, const cv::Mat depth_clean);
  static void onMouse( int evt, int x, int y, int flags, void* param );
};

cppfile.cpp

A::A(const std::string &winname, const cv::Mat depth_clean)
    : m_winname(winname), depthimagemouse(depth_clean)
{
//something..
}

void A::onMouse( int event, int x, int y, int flags, void* param )
{
//Here I want to use depthimagemouse member variable (and other members..)
}

我的问题是如何在onMouse方法中使用depthimagemouse变量?

2 个答案:

答案 0 :(得分:3)

如果图书馆在其文档中没有解释这一点,我会感到惊讶,但无论如何。当您使用不支持成员函数的回调时,这是标准过程,但您仍需要一种方法来访问成员数据。因此,您执行以下操作:

  • 在注册回调时,将对实例的引用作为用户数据指针param(或其成员)传递。
  • 将其强制转换为具体类型以访问其成员。类静态函数可以通过提供的实例完全访问其类的所有成员。

所以,你可以这样做:

auto &that = *static_cast<A *>(param); // <= C++03: use A &that
// Cast to const A if you want, or use a pointer, or etc.
std::cout << that.depthimagemouse << std::endl;

或者它通常在语法上更好地立即发送到成员函数并让它做所有事情:

static_cast<A *>(param)->doRestOfStuff(evt, x, y, flags);
// Include a const in the cast if the method is const

或介于两者之间的任何地方。

答案 1 :(得分:0)

depthimagemouse是一个实例成员,意味着每个A实例(如果您愿意,对象)都有自己的depthimagemouse。您的onMouse方法是静态方法,意味着它与任何特定的给定实例无关,而与所有实例无关,因此考虑访问{{1}是无意义的无需指定您感兴趣的实例。

如果没有关于depthimagemouse和您的模型的更多信息,很难告诉您该怎么做。可以使用onMouse来指定静态方法将接收的param实例吗?在这种情况下,可以使用强制转换将实例返回到方法中:A然后您可以使用它A *anInstance = static_cast<A *>(param);(请参阅我们正在讨论的anInstance->depthimagemouse给出实例?)等等。