这是我的代码,用于定义一个类并输入一些 double ,以便成员函数可以给出一个 Mat 对象。
#include <opencv2/core.hpp>
#include <iostream>
using namespace std;
using namespace cv;
class A{
public:
void fun(double, double, double);
void printfun();
private:
Mat R;
};
int main(int argc, char* argv[]){
A a;
a.fun(0.05, 0.05, 0.5);
a.printfun();
return 0;
}
void A::fun(double R_x, double R_y, double R_theta){
R = (Mat_<double>(3,3) << R_x,0,0,0,R_y,0,0,R_theta);
#double R_init[3][3]={{R_x, 0, 0},
# {0, R_y, 0},
# {0, 0, R_theta*3.1415/180}};
#
#R = Mat(3, 3, CV_64F, R_init);
cout << R << endl;
}
void A::printfun(){
cout << R << endl;
}
在函数A::fun
中,我需要计算一个定义为私有(private)变量的Mat
对象R。但是,当我使用 fun 中的第一句来执行此操作时,fun()
和 printfun()
中的 cout
都给出了正确的矩阵.如果我使用灰色的方法,fun()
中的 cout
打印正确,但 printfun()
中的 cout
> 给出了错误的矩阵 R。
这有点奇怪,因为当 fun()
返回时,第二种方法计算的矩阵 R 似乎发生了某种变化。如果这个方法没有在类类型中使用,它会正确运行并给出正确的矩阵 R。
另一个问题与这个问题无关。如果我总是可以在公共(public)或私有(private)中定义一个变量(比如 R),然后使用成员函数为这个变量赋值,那么成员函数的返回类型总是“void”,而不是它分配的变量。这是 c++ 类类型函数的方式吗?
我是 C++ 的新手,所以任何帮助将不胜感激。
最佳答案
您所观察到的行为有一个简单的解释。
it seems when the fun() returns, matrix R computed by the second method changes somehow
您的观察是正确的。以下是第一个和第二个赋值之间的区别:
在第一种方法中,R
的内容的内存是动态分配的,然后用指定的值初始化。当函数 fun
返回时,R
的内容由于动态分配而被保留。
在第二种方法中,静态数组R_init
(它是函数fun
的本地数组)用指定值初始化。然后在下一行中,创建了 R
并将其设置为使用 R_init
的内容。这里的关键区别是没有动态内存分配发生。 R
只是使用已经分配的数组 R_init
来存储值。这意味着如果我们修改R_init
,R
的内容也会改变。当 fun
返回时,无法保证 R_init
(也称为 undefined behavior)内容的有效性,这会导致打印垃圾值。
虽然对于静态初始化,第一种方法是首选。但是如果你真的想使用第二种方法,你可以使用 Mat::clone
函数强制单独复制内存,如下所示:
R = Mat(3, 3, CV_64F, R_init).clone();
对于第二个问题:
Is this the way the c++ class type functions?
函数返回类型不一定是 void
,因为它可能取决于您遵循的设计模式类型。这完全可以是一个选择问题。
关于c++ - 无法在 C++ 类中分配 cv::Mat 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44511057/