C++:重载 = 运算符以创建 uint8_t 兼容的数据类型
C++: Overloading the = operator to create an uint8_t compatible data type
我认为这应该是微不足道的:
我写了一个 class 来处理二进制编码的十进制 (BCD) 8 位值。
class 有 set()、get()、add()、sub() 等方法。工作完美。
get() 示例:
class bcd8_t {
public:
uint8_t get() { return value_u8; }
private:
uint8_t value_u8;
};
现在我想将此 class 转换为新的数据类型。我基本上想替换
之类的东西
bcd8_t a;
uint8_t b = a.get();
通过类似
的方式
bcd8_t a;
uint8_t b = (uint8_t)a;
所以我希望我可以编写一个 returns 和 uint8_t 的重载“=”运算符,例如:
class bcd8_t {
public:
uint8_t operator=() { return value_u8; }
private:
uint8_t value_u8;
};
然而,我尝试过的编译器告诉我的是
cannot convert 'bcd8_t' to 'uint8_t'
或
invalid cast from type 'bcd8_t' to type 'uint8_t'
如何做到这一点?
赋值运算符是将赋值给你的class.
要转换 class 的对象,您需要实施 type-cast 运算符:
class bcd8_t {
public:
...
operator uint8_t() const { return value_u8; }
...
};
对于您实现为成员函数的所有二元运算符(对于二元运算符,我指的是那些采用两个操作数的运算符,例如赋值、比较、加法等)那么您的对象 class 是总是运算符的left-hand端。
让我们以赋值运算符为例。如果您在 class 中重载赋值运算符并执行类似
的操作
bcd8_t a;
any_type b;
...
a = b;
然后编译器会将赋值转换为
a.operator=(b);
对于作为成员函数重载的所有运算符都是一样的。
另外,一些运算符(包括赋值运算符)只能作为成员函数实现。赋值运算符不能有 non-member 函数重载,这是不允许的。
参见例如this operator overloading reference 获取更多信息。
我认为这应该是微不足道的:
我写了一个 class 来处理二进制编码的十进制 (BCD) 8 位值。
class 有 set()、get()、add()、sub() 等方法。工作完美。
get() 示例:
class bcd8_t {
public:
uint8_t get() { return value_u8; }
private:
uint8_t value_u8;
};
现在我想将此 class 转换为新的数据类型。我基本上想替换
之类的东西bcd8_t a;
uint8_t b = a.get();
通过类似
的方式bcd8_t a;
uint8_t b = (uint8_t)a;
所以我希望我可以编写一个 returns 和 uint8_t 的重载“=”运算符,例如:
class bcd8_t {
public:
uint8_t operator=() { return value_u8; }
private:
uint8_t value_u8;
};
然而,我尝试过的编译器告诉我的是
cannot convert 'bcd8_t' to 'uint8_t'
或
invalid cast from type 'bcd8_t' to type 'uint8_t'
如何做到这一点?
赋值运算符是将赋值给你的class.
要转换 class 的对象,您需要实施 type-cast 运算符:
class bcd8_t {
public:
...
operator uint8_t() const { return value_u8; }
...
};
对于您实现为成员函数的所有二元运算符(对于二元运算符,我指的是那些采用两个操作数的运算符,例如赋值、比较、加法等)那么您的对象 class 是总是运算符的left-hand端。
让我们以赋值运算符为例。如果您在 class 中重载赋值运算符并执行类似
的操作bcd8_t a;
any_type b;
...
a = b;
然后编译器会将赋值转换为
a.operator=(b);
对于作为成员函数重载的所有运算符都是一样的。
另外,一些运算符(包括赋值运算符)只能作为成员函数实现。赋值运算符不能有 non-member 函数重载,这是不允许的。
参见例如this operator overloading reference 获取更多信息。