在班级定义和呼叫方面遇到困难

having difficulty with class definition and calling

本文关键字:方面 遇到 呼叫 定义      更新时间:2023-10-16

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

非静态成员参考必须相对于特定对象

for Line

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

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

实例化类的语法是

myClass auM(test);

您不需要"调用" myClass::myClass。至于Menber功能initClass,您称其为静态方法。需要在一个实例上调用非静态成员函数:

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

如果您只是想构造myclass,aum和bum的两个对象,那么您应该做

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

我认为您应该再查看有关C 中面向对象的编程的教程,例如此。正如Juanchopanza所说,您的具体问题基于静态成员和非静态成员之间的差异。有关此信息的信息可以在教程页面" class(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 );
}

我提到的惯例对于程序运行并不重要。尽管如此,我强烈建议您尽早习惯他们,因为它们会大大提高可读性和可维护性。