C++ 运算符 = 用于具有 class 成员函数的数组

C++ operator = for arrays with class member function

我有一个包装数据结构,我想为复制赋值运算符编写一个方法。我真的很想这样做(因为我的 byte_array 可以做一些非常酷的事情):

byte_array bytes = {0x00, 0xAB, 0xEE, 0xFF};

到目前为止,我尝试编写的函数如下所示:

template <int N>
byte_array& byte_array::operator = (const unsigned char (&a)[N]) {
    if(N <= capacity) { //capacity is a class field
        for(int i = 0; i < N; i++) array[i] = a[i]; //array is a class field
        usage = N; //usage is a class field
    }
    return *this;
}

但是,这段代码无法编译,因为它不喜欢我给它的列表。它不喜欢这方面的很多东西。

是不是我写的函数有问题,比如赋值运算符只作用于同类型的对象(比如byte_arrayunsigned char[]冲突)?我试图将其分配为与 unsigned char[] 类型不匹配,这是我的 'list' 的问题吗?

我的功能基于对 this past question about arrays in C++ 的回答。

的问题
byte_array bytes = {0x00, 0xAB, 0xEE, 0xFF};

是你的右手边实际上没有数组。您有一个 初始化程序列表 ,它没有类型。

你可以做的是取一个 std::initializer_list<unsigned char> 并且可以从 初始化列表 .

构造

在 C++98 中,您可以创建一个临时数组,然后像这样从赋值中使用该数组

byte_array bytes;
//some code
{
    unsigned char temp[] = {0x00, 0xAB, 0xEE, 0xFF};
    bytes = temp;
}
// more code

另请注意,Type name = initializer; 永远不会赋值。它被称为复制初始化/复制列表初始化(如果initializer是一个初始化列表 ), 并调用对象的 copy/move 构造函数。赋值运算符只有在你有一个已经构造好的对象时才会被调用。

问题是您正在尝试分配 initializer_list {a, b, c} 而不是数组。您可能希望将初始化列表用作参数:

#include <iostream>


struct byte_array
{
    byte_array& operator = (const std::initializer_list<unsigned char>& tab) {
        for (unsigned char item: tab)
            std::cout << item << "\n";
        return *this;
    }
};

int main()
{
  byte_array bytes;
  bytes = {'a', 'b', 'c', 'd'};
  (void)bytes;
}

运行 在这里:http://cpp.sh/2vv6m