写保存和读取坐标点的函数遇到的问…

来源:互联网 发布:电视网络机顶盒什么牌子的好 编辑:程序博客网 时间:2024/06/05 22:58

写了两个函数,一个函数的功能是保存图像的深度和色彩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++最好传递引用,而不是传递对象,效率会有提升。就是传值和传地址的区别



0 0