具有固定长度数组作为参数的 C++ 构造函数[关闭]

Posted

技术标签:

【中文标题】具有固定长度数组作为参数的 C++ 构造函数[关闭]【英文标题】:C++ Constructor with fixed length array as parameter [closed] 【发布时间】:2015-11-21 19:45:42 【问题描述】:

我确定这是重复的,但我所看到的一切都解释了如何为数组动态分配内存。我有一个固定长度的数组,我只想把它放在一个包装结构中以便于参考。这是最基本的代码:

头文件

#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

CPP 文件

#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);

编译错误

$ g++ test.cpp include/board_t.cpp -o test.out
test.cpp: In function ‘int main()’:
test.cpp:6:25: error: no matching function for call to ‘board_t::board_t(unsigned int [16])’
  board_t b = board_t(arr);
                         ^
test.cpp:6:25: note: candidates are:
In file included from test.cpp:1:0:
include/board_t.hpp:6:2: note: board_t::board_t(board_t&)
  board_t(board_t& other);
  ^
include/board_t.hpp:6:2: note:   no known conversion for argument 1 from ‘unsigned int [16]’ to ‘board_t&’
include/board_t.hpp:5:2: note: board_t::board_t()
  board_t();
  ^
include/board_t.hpp:5:2: note:   candidate expects 0 arguments, 1 provided

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

如果这非常明显,再次抱歉。我尽量不要用重复来污染 SE,但有时我就是忍不住 ;)

【问题讨论】:

您可能只需要测试文件中的board_t b(arr); 是的,这很愚蠢。对不起各位,浪费大家时间! 在 C++ 中,编译器比任何人都“聪明”得多,所以人类犯的所有错误都是“愚蠢的”:) " 我有一个固定长度的数组,我只想把它放在一个包装结构中以便于引用。" 你的意思是,像std::array? 注意这与数组无关 【参考方案1】:

你应该这样做

board_t b(arr);

不是

board_t b = board_t(arr);

原因如下。当你写

board_t b = board_t(arr);

编译器创建一个临时实例,然后尝试使用复制构造函数初始化 b,并将您的临时实例作为参数。但是,您的临时值是 r 值。您的复制构造函数声明为

board_t(board_t& board);

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

board_t(const board_t& board);

那么你的代码就可以正常工作了。

备注:尽管理论上会像您的代码一样创建临时文件,但大多数编译器会优化掉临时文件并在现场创建 b,而不会创建临时文件。如果您有兴趣,请查找复制省略。

【讨论】:

哈,您不仅在我的测试程序中发现了(愚蠢的)错误,即复制粘贴错误,而且您解决了我试图传达的问题。谢谢...【参考方案2】:

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

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

LIVE DEMO

【讨论】:

以上是关于具有固定长度数组作为参数的 C++ 构造函数[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何管理具有递归函数调用的模板类中的数组(以数组的长度作为参数)?

模板参数固定的C++函数参数数量[重复]

C#调用C++的dll库怎么传递结构体中不定长度的char数组

c++,类的对象作为形参时一定会调用复制构造函数吗?

我需要 C++ 数组类模板,它是固定大小、基于堆栈且不需要默认构造函数

C++ 构造函数的默认参数[关闭]