2

在 c++ 中(使用 openCV),我在头文件中定义了我的调用,如下所示:

class myClass
{
public: 
    myClass ( cv::Mat& _mat );
    void initClass ( cv::Mat& img, cv::Mat& mask, myClass& src, myClass& dst );
}

然后在相应的“cpp”文件中,我这样定义:

myClass::myClass ( cv::Mat& _mat )
{
    model = _model;
     ....
 }

void myClass::initClass ( cv::Mat& img, cv::Mat& mask, myClass& src, myClass& dst )
{
    //some work here
}

然后我将它的头文件包含在“main.cpp”中,并尝试这样调用它:

cv::Mat test ( height, width, CV_8UC3 );
cv::Mat test2 ( height, width, CV_8UC3 );
myClass::myClass auM ( test );
myClass::myClass buM ( test );
myClass::initClass ( img, img, auM, buM );

但它在最后两行都给出了错误,说:

无法确定要使用哪个重载函数“myClass::myClass”实例

对于线

myClass::myClass auM ( test );
myClass::myClass buM ( test );

非静态成员引用必须相对于特定对象

为线

    myClass::initClass ( img, img, auM, buM );

我搜索并发现它与我的类定义有关,但我无法解决它。有人可以帮助我吗?

4

3 回答 3

2

使用一个构造函数参数实例化一个类的语法是

myClass auM(test);

你不需要“打电话” myClass::myClass。至于 menber 函数initClass,您将其称为静态方法。需要在实例上调用非静态成员函数:

auM.someMethod( arg1, arg2, .... );
于 2012-10-19T17:51:02.633 回答
2

如果您只是想构建 myClass 的两个对象,auM 和 buM,那么您应该这样做

myClass auM ( test );
myClass buM ( test );
于 2012-10-19T17:51:18.517 回答
1

我认为您应该再看一篇关于 C++ 中面向对象编程的教程,例如这个。正如 juanchopanza 所说,您的具体问题是基于静态和非静态成员之间的差异。这方面的信息可以在教程页面“Classes (II)”中找到。

简而言之:非静态成员(最常用的类型)属于一个类的对象(实例)。这意味着您需要先实例化类,然后才能访问变量或调用函数。像这样:

MyClass myObject();
myObject.nonStaticMemberFunction();

另一方面,静态成员属于一个类而不是该类的特定对象,它们可以通过访问类的名称来调用。像那样:

MyClass::staticMemberFunction();

这只是关于如何调用这些不同类型的函数的粗略概述,请查看教程,以真正了解差异。

还有一些我会在你的代码中改变的东西,我并不总是得到你想要实现的东西,但我会这样做:

// Never heard of a "call" keyword, must be a #define?!
// By convention most people use upper case class names, to
// distinguish classes from objects.
class MyClass 
{
public: 
    MyClass ( cv::Mat& _mat );
    // If your convention is to use underscores to mark function parameters,
    // you should stick to it.
    void initClass ( cv::Mat& _img, cv::Mat& _mask, myClass& _src, myClass& _dst );
}

MyClass::MyClass ( cv::Mat& _mat )
{
    // I don't know where these variables come from, but again:
    // if you use underscores, to mark function parameters, you
    // shouldn't use them with other variable types.
    model = _model;
    ....
 }

void MyClass::initClass ( cv::Mat& _img, cv::Mat& _mask, myClass& _src, myClass& _dst )
{
    //some work here
}

int main( int argc, const char* argv[] )
{
    cv::Mat test ( height, width, CV_8UC3 );
    cv::Mat test2 ( height, width, CV_8UC3 );
    MyClass auM ( test );
    MyClass buM ( test );
    // as "initClass is a non-static member, you have to instantiate
    // MyClass before calling it:
    MyClass cuM ( test );
    cuM.initClass ( img, img, auM, buM );
}

我提到的约定对于程序运行并不重要。不过,我强烈建议您尽早习惯它们,因为它们大大提高了可读性和可维护性。

于 2012-10-19T23:34:29.863 回答