写了两个函数,一个函数的功能是保存图像的深度和色彩save(Device device)
;另一个函数的功能是保存图像的骨架信息saveSkeleton(Device device)
在我传入设备的时候,出现了错误,是什么私有成员不能访问的错误。后来改成
传地址,错误消失。
出现问题:
问题1:为什么传入地址就没有错误。
问题2:我传入参数的时候错误,为什么他报的是私有成员不能访问的错误。我
在哪访问私有成员了,什么是私有成员。
问题3:即便这个构造函数是私有的。但是我创建这个类的对象应该和这个没有
什么关系吧。怎么会报错呢?
问题1原因:我的理解是:如果你传入的不是地址的话,他就不是在主函数中创
建的那个对象,而是新建的一个对象,即原对象的副本,也就是按值传递对象意
味着创建原始对象的一个副本。但是创建副本为什么会报错呢?顶多就是浪费一
点内存。因为当原对象改变的时候,副本不会改变,而摄像机(设备)是一直在
一帧一帧的录视频,原对象一定会发生改变,所以会出现不一致。所以报错。
问题2原因:我将Device这个类转到定义查看了一下,发现这个类里面有一个私
有的构造函数是这样定义的Device(const Device&)。经查书得,这样定义叫做
复制构造函数。但是问题又来了,什么是复制构造函数,并且他有什么作用?
经调查:
在C++中,下面三种对象需要拷贝的情况。因此,拷贝构造函数将会被调用。
1). 一个对象以值传递的方式传入函数体
2). 一个对象以值传递的方式从函数返回
3). 一个对象需要通过另外一个对象进行初始化
本人遇到的属于第三种。但是对于第一种也不应该报错啊,我这个对象以值的方
式传入函数体,也合理啊?他只能说我得不到想要的东西,但是为什么会报错呢
?这样又转到了问题1。
问题3原因:
猜想:是不是这个类是不能够复制的。复制就会报错。Device类的对象作为参数
传入函数时必须以指针的形式传入,否则就会报错。
问题4:在打开设备的时候,出现设备不存在的情况,后来加入代码
openni::Status result = openni::STATUS_OK;
result = OpenNI::initialize();
这句代码的作用是什么??
原因:如果函式有正确执行的話,所得到的回传值会是openni::STATUS_OK,但是这并不能解释这个问题。要是说Openni不初始化,Device类就不能使用,但是这完全
可以不要第一句话。刚才试了一下,确实不要第一句话可以。
使用引用传递的效率也会很高,可以节省内存和时间,好像还可以避免截断问题
,具体原因网上有很多。
程序存在的问题:程序一段时间会出现错误,可能是录取的视频的时候,所用的内存会随着帧数的增多而增大,所以到一段程序就是弹出出错框。不知道对不对。有错误,请指正。
下面是老师给总结的(一看就看出水平来了):
出现错误的原因是device类的拷贝构造函数是private的,在函数传参数时,会新建一个device对象,然后调用拷贝构造函数。拷贝构造函数是private的,导致private成员不能访问,所以编译出错。
而传递引用的话相当于传递了一个对象指针(是相当于),实际上并没有新建对象,所以不会出错
这算是一个技巧吧。btw(顺便说一下),一般传递参数的时候c++最好传递引用,而不是传递对象,效率会有提升。就是传值和传地址的区别