之前写了一篇关于友元使用的博客(友元的使用 - 小凉拖 - 博客园 (cnblogs.com))但是发现并不好用,原因是:
当我把Grad类作为SemiGlobalMatching的友元时,Grad类中并不能使用SemiGlobalMatching赋值好了的成员属性(比如说height_这个属性),也就是我在主函数中定义了一个实例化了一个SemiGlobalMatching类的对象(姑且认为它是名称1),并通过调用SemiGlobalMatching类的Initialize成员函数给height_赋值。然后我又在grad_compute.h文件中新开了一个SemiGlobalMatching类的堆区,并把它赋给对象指针(姑且认为是名称2)。名称1和名称2并不是同一个东西,因此Grad类中并不能使用SemiGlobalMatching赋值好了的成员属性。代码如下:
main.cpp中的代码:
1 //main函数中实例化的SemiGlobalMatching对象 2 SemiGlobalMatching sgm;
1 //调用成员函数给height_属性传值 2 if (!sgm.Initialize(width, height, sgm_option))
部分SemiGlobalMatching.cpp中的代码:
1 bool SemiGlobalMatching::Initialize(const sint32& width, const sint32& height, const SGMOption& option) 2 { 3 // ··· 图像参数赋值 4 5 // 影像尺寸 6 width_ = width; 7 height_ = height;
部分grad_compute.cpp中的代码:
1 bool Grad::SobelGradCompute(const uint8* img, sint8* imageSobelX, sint8* imageSobelY, float32* angle) 2 { 3 4 semiGlobalMatching = new SemiGlobalMatching; 5 auto hight = semiGlobalMatching->height_; 6 auto width = semiGlobalMatching->width_; 7 cout << "grad_compute.cpp文件最终拿到的成员属性height_" << endl; 8 cout << semiGlobalMatching->height_<< endl;
结果如下:
改进方法:
在“SobelGradCompute”成员函数的参数列表中加一个对象引用,用来接main函数中实例化好的SemiGlobalMatching类的对象这样就可以了!
在主函数中给Grad类的“SobelGradCompute”成员函数传递sgm对象:
1 Grad grad; 2 grad.SobelGradCompute(bytes_left, imgeX, imgeY, ang, sgm);
部分grad_compute.c中的代码:
1 bool Grad::SobelGradCompute(const uint8* img, sint8* imageSobelX, sint8* imageSobelY, float32* angle, const SemiGlobalMatching &sgm) 2 { 3 4 auto hight = sgm.height_; 5 auto width = sgm.width_; 6 cout << "grad_compute.cpp文件最终拿到的成员属性height_" << endl; 7 cout << sgm.height_ << endl;
*注意*引用访问成员的时候用“.”,指针访问成员的时候用“->”