在班级定义和呼叫方面遇到困难
having difficulty with class definition and calling
在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 );
}
我提到的惯例对于程序运行并不重要。尽管如此,我强烈建议您尽早习惯他们,因为它们会大大提高可读性和可维护性。
相关文章:
- 编译包含字符串的代码时遇到问题
- 遇到新行时,有没有办法停止istream_iterator
- 在使用GPU支持编译Tensorflow时,会遇到CUDA_TOOLKIT_PATH未绑定变量
- 如何在C++向量中奇数元素前面加上值-1,我在使用insert函数时遇到了问题
- 在 for 循环中查找问题时遇到困难
- GCC和Clang在与__builtin_constant_p相关的static_assert方面有所不同
- 为什么我在虚幻引擎中的多态性和接口方面遇到问题?
- 我在内存泄漏和字符串方面遇到了一个非常奇怪的问题
- 在客户端/服务器计算器C 方面遇到麻烦
- 在功能方面遇到了一些问题,以及它们如何干扰Main
- C++ 在发送什么参数方面遇到问题
- 在班级定义和呼叫方面遇到困难
- 在具有模板成员功能的模板类方面遇到麻烦
- 在类范围方面遇到问题
- C++ 我在数组/动态内存方面遇到了一些问题
- C++在sscanf模式方面遇到问题
- 我在一个简单的参数依赖查找/模板类型推断问题方面遇到问题
- 第一次制作了一个跨越几个类的程序,但我在函数调用方面遇到了问题
- 用C语言制作一个基本外壳,在管道/叉子方面遇到问题
- 视觉我在C++的继承和多态性方面遇到了麻烦