在课堂定义和调用方面遇到困难

时间:2012-10-19 17:48:22

标签: c++ class opencv

在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 );

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

3 个答案:

答案 0 :(得分:2)

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

myClass auM(test);

您无需“呼叫”myClass::myClass。对于menber函数initClass,您将其称为静态方法。需要在实例上调用非静态成员函数:

auM.someMethod( arg1, arg2, .... );

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

我认为你应该再看一下c ++中面向对象编程的教程,例如this一个。正如juanchopanza所说,您的具体问题是基于静态和非静态成员之间的区别。有关这方面的信息可以在教程页面“课程(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 );
}

我提到的约定对于运行程序并不重要。尽管如此,我强烈建议您尽早使用它们,因为它们可以提高可读性和可维护性。