使用const char*和/或字符串重载运算符=或运算符[]

Overloading operator= or operator[] using const char* and/or string

本文关键字:运算符 const 重载 字符串 使用 char      更新时间:2023-10-16

我一直在谷歌和stackoverflow上搜索,到目前为止还没有明确的答案,所以我直接问。。。

我制作了一个位图字体类,我想使用赋值运算符:operator=(constchar*(为该类的文本分配一个字符串文字。注意:我还想使用string、string*和char*进行赋值。。。例如:

class BitmapText{
private:
    std::string _text;
public:
    void operator=(const char* _t){
        _text = _t;
    }
    /*I've also tried another iteration of this operator using
    BitmapText& operator=(const char* _t){
        _text = _t;
        return *this;
    }
    */
    BitmapText(){}
    ~BitmapText(){}
};

BitmapText* t1 = new BitmapText();
t1 = "Hello World"

将字符字符串分配给BitmapText对象会产生如下结果:

Assigning to 'BitmapText*' from 'const char[12]' incompatible type.

我相信这是有充分理由的。但是它可以用字符串类来完成。我查看了字符串类,它的类型定义来自:

typedef basic_string<char, char_traits<char>, allocator<char> > string;

这就是为什么我可以给字符串类分配一个char数组的原因吗?因为它似乎以某种方式继承了char的特性?如果没有这么复杂的实现,我能超负荷地尝试吗?

我的第二个问题(我认为(大致如下:我想使用运算符[](const char*_name(返回一个名称与_name值匹配的子对象。

我看到的每个运算符重载示例都使用与被重载的运算符相同类类型的右手操作数。然而,我读过,你可以使用不同的数据类型,我们可以清楚地使用char*为std::string对象赋值。。。

我错过了什么?我们非常感谢所有的帮助。

以以下方式定义操作员

BitmapText & operator =( const std::string &t )
{
    _text = t;
    return *this;
}

它可以用于std::string类型的对象和char *类型的对象,因为由于类std::string的转换构造函数存在从const char *std::string的隐式转换。

关于这个代码片段

BitmapText* t1 = new BitmapText();
t1 = "Hello World"
^^^               ^^

则必须以以下方式重写

BitmapText* t1 = new BitmapText();
*t1 = "Hello World";

此声明

t1 = "Hello World";

是错误的,因为您正试图将const char *类型的指针分配给BitmapText *类型的指针。

您正在尝试分配给t1,它不是BitmapText,而是指向BitmapText的指针;

如果你做*t1 = "Hello World";,它应该会起作用。

您正试图将字符串文本的地址分配给指针。请尝试:

BitmapText* t1 = new BitmapText();
(*t1)= "Hello World";