这是我的代码,用于定义一个类并输入一些双精度数,以便成员函数可以给出一个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
中,我需要计算一个Mat
对象 R ,它被定义为私有变量。但是,当我有趣地使用第一句话时,cout
和fun()
中的printfun()
都会给出正确的矩阵。如果我使用灰色方法,则cout
中的fun()
打印正确,但cout
中的printfun()
会生成错误的矩阵R.
这有点奇怪,因为当fun()
返回时,第二种方法计算的矩阵R会以某种方式发生变化。如果此类方法未在类类型中使用,则它将正常运行并提供正确的矩阵R。
另一个问题与此问题无关。如果我总是可以在公共或私有中定义变量(比如说R),然后使用成员函数为这个变量赋值,那么成员函数的返回类型总是可以&#34; void&#34;而不是它分配的变量的类型。这是c ++类类型的运作方式吗?
我是c ++的新手,所以任何帮助都会受到赞赏。
答案 0 :(得分:2)
您正在观察的行为有一个简单的解释。
似乎当fun()返回时,矩阵R由第二个计算 方法有所改变
你的观察是正确的。以下是第一个和第二个任务之间的区别:
在第一种方法中,R
内容的内存是动态分配的,然后用指定的值初始化。当函数fun
返回时,由于动态分配,R
的内容将被保留。
在第二种方法中,使用指定的值初始化静态数组R_init
(函数fun
的本地)。然后在下一行中创建R
并设置为使用R_init
的内容。这里的关键区别是没有动态内存分配。 R
只使用已分配的数组R_init
来存储值。这意味着如果我们修改R_init
,R
的内容也会发生变化。当fun
返回时,无法保证R_init
(a.k.a undefined behavior)内容的有效性,这会导致打印垃圾值。
虽然对于静态初始化,但首选方法是首选方法。但是如果你真的想使用第二种方法,可以使用Mat::clone
函数强制单独复制内存,如下所示:
R = Mat(3, 3, CV_64F, R_init).clone();
关于第二个问题:
这是c ++类类型的运作方式吗?
函数返回类型可能不一定是void
,因为它可能取决于您遵循的设计模式类型。这完全是一个选择问题。