C ++构造函数,其中包含固定长度数组作为参数

时间:2015-11-21 19:45:42

标签: c++ arrays constructor

我确定这是重复的,但我所见过的所有内容都解释了如何为数组动态分配内存。我有一个固定长度的数组,我只想把它放在一个包装器结构中,以方便参考。这是简单的代码:

HEADER FILE

positions.insert(RefEquality(&left_rook), (0, 0));
positions.insert(RefEquality(&right_rook), (0, 7));

CPP文件

#ifndef BOARD_T_H
#define BOARD_T_H
#include <iostream>
struct board_t {
    board_t();
    /* I've tried explicitly assigning length b[16] and just declaring
    * b[]. Neither seem to work.
    ------------------------v                     */                      
    board_t(unsigned int b[16]);
    board_t(board_t& other);
    unsigned int values[16];
};

#endif

测试文件

#include "board_t.hpp"
board_t::board_t(){
    for (int i = 0; i < 16; ++i) values[i] = 0;
}

board_t::board_t(unsigned int b[16]) {
    for (int i = 0; i < 16; ++i) {
        values[i] = b[i];
    }
}
board_t::board_t(board_t& other) {
    for (int i = 0; i < 16; ++i) this->values[i] = other.values[i];
}

编制错误

#include "board_t.hpp"

int main(){
    unsigned int arr[16]; 
    for (int i = 0; i < 16; ++i ) arr[i] = i;
    board_t b = board_t(arr);
}

我知道有一些方法(比如使用std :: array或boost等),但这真的让我烦恼 - 我只需要知道如何让它工作!

如果这非常明显,请再次抱歉。我尽量不重复污染SE,但有时候我无法帮助自己;)

2 个答案:

答案 0 :(得分:3)

你应该做的

board_t b(arr);

board_t b = board_t(arr);

原因如下。当你写

board_t b = board_t(arr);

编译器创建一个临时实例,然后尝试使用copy-construtor初始化 b ,将临时值作为参数。但是,您的临时值是r值。您的copy-constructor声明为

board_t(board_t& board);

即,引用对board_t类型的变量的引用。但是,r值不能作为参考参数传递。但是,R值可以传递给 const 引用。意思是,如果你写

board_t(const board_t& board);

然后你的代码就可以了。

备注:尽管理论上会在您的代码中创建一个临时代码,但大多数编译器会优化临时代码并在现场创建 b ,而不会创建临时代码。如果你有兴趣,请查找copy-elision。

答案 1 :(得分:0)

您只需要正确定义复制构造函数:

board_t(board_t const& other);
                ^^^^^

LIVE DEMO