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_array
和unsigned 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
我有一个包装数据结构,我想为复制赋值运算符编写一个方法。我真的很想这样做(因为我的 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_array
和unsigned 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