使用文件输入中的值初始化类中的const成员变量

时间:2015-06-24 07:09:21

标签: c++ initialization const

我想定义一个const变量,它是类的一部分,如:

// camera.h
class Camera{
public:
    Camera(std::string file);
    ~Camera() {}
    const size_t FRAME_HEIGHT;
    const size_t FRAME_WIDTH;
private:
    std::string file;
    cv::VideoCapture cap;
    Read();
};

_____________________________________

// camera.cpp
Camera::Camera(std::string file) : file("settings.yml") {
    //...
    read();
    cap.open(0);
    cap.set(CV_CAP_PROP_FRAME_HEIGHT, FRAME_HEIGHT);
    cap.set(CV_CAP_PROP_FRAME_WIDTH, FRAME_WIDTH);
}

void Camera::read(){
    // read something
}

然而,这不能使用初始化列表,因为我首先必须从设置文件中读取此数据。

致电read()后,我设置了const变量FRAME_HEIGHTFRAME_WIDTH

是否可以留下const,如果可以,我应该如何/在哪里这样做?

2 个答案:

答案 0 :(得分:0)

一个选项是从文件初始化设置对象,并从中获取所需的值:

Camera

此后,将 Camera(const Settings& settings) : FRAME_HEIGHT(settings.getFrameHeight()) , FRAME_WIDTH(settings.getFrameWidth()) { } 构造函数重写为

也是有意义的
    $(document).ready(function tableload() {

    $('table.display').dataTable( {
        "sScrollY": "300px",
        "sPaginationType": "full_numbers",
        "iDisplayLength": -1,
    //  "aLengthMenu": [[20, 50, 100, -1], [20, 50, 100, "All"]],
        "aLengthMenu": [[10, 20, 50, -1], [10, 20, 50, "All"]],
        "bScrollCollapse": true, 
        "bPaginate": true,
        "bJQueryUI": true,
        "aoColumnDefs": [
            { "aTargets": [ -1 ] }
        ]
    } );


    /* Add a click handler to the rows - this could be used as a callback */
    $("#example tbody tr").click( function( e ) {
        if ( $(this).hasClass('row_selected') ) {
            $(this).removeClass('row_selected');
        }
        else {
            oTable.$('tr.row_selected').removeClass('row_selected');
            $(this).addClass('row_selected');
        }
    });

    /* Add a click handler for the delete row */
    $('#delete').click( function() {
        var anSelected = fnGetSelected( oTable );
        if ( anSelected.length !== 0 ) {
            oTable.fnDeleteRow( anSelected[0] );
        }
    } );

    /* Init the table */
    oTable = $('#example').dataTable( );
} );

- 这样您就可以从任何地方进行设置,而不仅仅是从文件中进行设置。

答案 1 :(得分:0)

如果使用中间类,可以这样:

class Camera {
    struct Reader {
        int value;

        Reader(bool x) {
            // Do whatever you like
            value = x ? 42 : 0xDEAD;
        }
    };
    Camera(Reader&& r) : value(::std::move(r.value)) { }

public:
    int const value;

    template<typename... V>
    Camera(V... args)
    : Camera(Reader(std::forward<V>(args)...))
    { }
};

这有效地为初始化添加了另一个阶段,但仍然保持封装(Reader并且相应的构造函数对Camera是私有的!)。性能影响应该可以忽略不计(正向和移动操作通常很便宜),除非你在一些紧密的内循环中初始化数百万个这些对象。

相关问题