C++:重载=运算符以创建uint8_t兼容数据类型

Kom*_*ner 0 c++ types casting overloading

我认为这应该是微不足道的:

我写了一个类来处理二进制编码的十进制(BCD)8位值.
该类有像set(),get(),add(),sub()等的方法.完美的工作.
get()的示例:

class bcd8_t {
  public:
    uint8_t get() { return value_u8; }
  private: 
    uint8_t value_u8;
}; 
Run Code Online (Sandbox Code Playgroud)

现在我想将此类转换为新的数据类型.我基本上想要替换类似的东西

bcd8_t  a;  
uint8_t b = a.get();  
Run Code Online (Sandbox Code Playgroud)

通过类似的东西

bcd8_t  a;  
uint8_t b = (uint8_t)a;
Run Code Online (Sandbox Code Playgroud)

所以我希望我能写一个重载的"="运算符,它返回一个uint8_t,如:

class bcd8_t {
  public:
    uint8_t operator=() { return value_u8; }
  private: 
    uint8_t value_u8;
}; 
Run Code Online (Sandbox Code Playgroud)

然而,我曾经尝试过的编译器告诉我

cannot convert 'bcd8_t' to 'uint8_t'  
Run Code Online (Sandbox Code Playgroud)

要么

invalid cast from type 'bcd8_t' to type 'uint8_t'
Run Code Online (Sandbox Code Playgroud)

这该怎么做?

Som*_*ude 5

赋值运算符将分配您的类.

要转换类的对象,您需要实现一个类型转换操作符:

class bcd8_t {
public:
    ...
    operator uint8_t() const { return value_u8; }
    ...
};
Run Code Online (Sandbox Code Playgroud)

对于你实现为成员函数的所有二元运算符(使用二元运算符,我指那些采用两个操作数的运算符,例如赋值,比较,加法等),那么你的类的对象总是运算符的左侧.

让我们以赋值运算符为例.如果你在类中重载赋值运算符并执行类似的操作

bcd8_t a;
any_type b;
...
a = b;
Run Code Online (Sandbox Code Playgroud)

那么编译器会将赋值转换为

a.operator=(b);
Run Code Online (Sandbox Code Playgroud)

对于作为成员函数重载的所有运算符,它是相同的.

此外,某些运算符(包括赋值运算符)只能实现为成员函数.您不能让赋值运算符的非成员函数重载,这是不允许的.

有关详细信息,请参阅此运算符重载参考.