C++嵌套类的修改——以如本RVC相机的SDK包为例

Posted 户用名匿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++嵌套类的修改——以如本RVC相机的SDK包为例相关的知识,希望对你有一定的参考价值。

特别鸣谢盛齐师兄指导调代码,及女朋友科普内部类。


因项目需要,使用如本RVC相机。在C++中调用官方的SDK包完成拍照,为了适应实验环境,需要调整某一参数。

起初没觉得有多难,因为如本的图形用户界面RVC Manager里就有调节这一参数的选项,所以它的SDK里必然有调整参数的接口。

打开doc帮助文档一顿莽,啪的一下很快啊,找到了参数所在位置:

首先定义了一个类RVC::X1,这个类封装了相机拍照的所有函数和参数,以及一个嵌套类(内部类)RVC::X1::CaptureOptions。该内部类存放相机的所有参数,包括我们想修改的那一个。这里我把这个类的结构列出来:

值得一提的是,X1类的对象需要用到电脑连接的相机硬件编号初始化的,我们只用一个镜头拍照,所以只能建立一个对象。(拒绝海王(大雾))


巧的是,我们想修改的变量恰好定义为public公有类型,就很简单了。我们只需要按照嵌套类的定义修改一下变量的值就行了。


在这里我们插入一下关于内部类的相关内容。(以下内容来自《Visual C++从入门到精通》,清华大学出版社)


class A{

    public:

        class B             //在类A的内部定义类B

        {friend class A;    //将A作为B的友元类

        public:

            int x;

        private:

            int y;};

        B b;                //实例化一个B的对象

        void set()

        {b.x=1;             //A的成员函数访问B的变量

        b.y=2;}               

};


由上述代码我们发现,要使A的成员函数可以访问B的变量,需要两个条件

1,实例化一个B的对象;2,将A作为B的友元类。这里条件1格外注意一下,它为下面的分析埋下了伏笔。


此外,对于内部嵌套类而言,内部类只有在外围类的范围内才可以使用,在其他地方不可见,需要用外围类域作限定符。

比如:

int main(int argc, char * argv[])

{

    B b;       //不行。

    A::B b;   //彳亍。

}


前面分析了RVC::X1类的结构,和内部类的调用方法,我们最直观的想法肯定是,首先定义X1的对象,然后我们修改内部类的参数,之后该干啥干啥。


可是不行。


略去过程,我们直接说原因。

首先,我们发现在定义RVC::X1的对象时,并没有给内部类RVC::X1::CaptureOptions实例化对象。这一点尤其不同于我们在了解内部类时所用的那个例子。(你这个类,啊,不讲武德!)

那么,是什么时候给内部类CaptureOptions实例化对象的呢?是在调用Capture()函数时,因此,我们修改内部类参数不应早于Capture()出现;


其次,我们注意到Capture()函数在实例化对象时将之定义为const常量,这个const不得了啊,定义了之后就不能修改了,一诺千金,就连铁骨铮铮的王境泽都要直呼内行。所以,我们修改内部类参数不应晚于Capture()出现;


这样一来,我们说修改参数既不能早于Capture()出现,又不能晚于Capture()出现,那不就只能在调用Capture()的时候修改了?

是这样的。


这里提供两个思路:

法1

修改CaptureOptions类的初始化函数CaptureOption()。在这个函数里手工给了各个变量的初值,直接修改即可。因为在RVC的SDK包里只有头文件可以访问,故该方法可行。

法2

我们说麻烦就麻烦在Capture()的缺省初始化参数,那我不用它不就行了?首先实例化一个内部类RVC::X1::CaptureOptions的对象temp,因为创建对象就要用到它的创建函数CaptureOption(),所以我们创建的这个对象,它的参数显然也是我们不想要的。

但是,我们自己创建的这个对象并没有const的限制,我们可以自由修改参数。比如:


temp.exposure_time = 10;


这样,我们在使用拍照函数Capture()时,不使用缺省参数,而把我们修改后的参数(对象temp)传入,即可用自定义参数完成初始化。


x1.capture()        //用的缺省参数

x1.capture(temp)    //用的自定义参数


综上,是在使用如本RVC的SDK包时遇到的一个有意思的地方。最大的收获是:嵌套类的调用、const关键字的意义、和缺省参数的使用。

以及,把两行代码水成一篇一千四百多字的文章,我可真行。



另:我把这篇发了CSDN博客,欢迎来看呀

https://blog.csdn.net/tuck_frump/article/details/116561467

(点阅读原文也可)

以上是关于C++嵌套类的修改——以如本RVC相机的SDK包为例的主要内容,如果未能解决你的问题,请参考以下文章

相机SDK开发

海康相机sdk调试错误

C++ 中嵌套类型/类的前向声明

如何在 C++ 中获取嵌套类的实例

❥关于C++之嵌套类

Baumer工业相机堡盟工业相机如何通过BGAPISDK里的图像处理库进行图像转换(C++)