C++ 使用常量字符*和/或字符串重载运算符=或运算符[]

C++ 使用常量字符*和/或字符串重载运算符=或运算符[],c++,string,char,operator-overloading,C++,String,Char,Operator Overloading,我一直在搜索谷歌和stackoverflow,到目前为止还没有明确的答案,所以我直接问 我创建了一个位图字体类,我想使用赋值操作符operator=(const char*)将字符串文字赋值给类的文本。 注意:我还想使用string、string*和char*。。。 例如: class BitmapText{ private: std::string _text; public: void operator=(const char* _t){ _text = _t

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

我创建了一个位图字体类,我想使用赋值操作符operator=(const char*)将字符串文字赋值给类的文本。 注意:我还想使用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"
将char字符串指定给BitmapText对象会产生如下结果:

Assigning to 'BitmapText*' from 'const char[12]' incompatible type.
我相信这是有很好的理由的。但是它可以通过string类完成。我查看了string类,它的类型定义如下:

typedef basic_string<char, char_traits<char>, allocator<char> > string;
typedef基本字符串;
这就是为什么我可以将char数组分配给string类的原因吗?因为它似乎继承了char的特性?如果没有如此复杂的实现,我可以以超负荷的方式尝试吗

我的第二个问题(我认为)大致相同: 我想使用操作符[](const char*_name)返回一个名称与_name值匹配的子对象

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

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

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


如果您这样做,
*t1=“Hello World”它应该可以工作。

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

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

按以下方式定义运算符

BitmapText & operator =( const std::string &t )
{
    _text = t;

    return *this;
}
BitmapText* t1 = new BitmapText();
*t1 = "Hello World";
它可以用于类型为
std::string
的对象和类型为
char*
的对象,因为类的转换构造函数
std::string
存在从
const char*
std::string
的隐式转换

至于这个代码片段

BitmapText* t1 = new BitmapText();
t1 = "Hello World"
^^^               ^^
然后,它必须按照以下方式重写

BitmapText & operator =( const std::string &t )
{
    _text = t;

    return *this;
}
BitmapText* t1 = new BitmapText();
*t1 = "Hello World";
此声明

t1 = "Hello World";

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

WTF的指针<代码>t1
是一个指针。。。不能为非用户定义的类型重载运算符,指针不是用户定义的类型。您忘记了取消引用
t1
。试试
*t1=“你好世界”
您可能需要
位图文本t1;t1=“你好,世界”。除非真的需要,否则不要动态分配东西。谢谢大家。BitmapText只是实际类的简化版本。指针实际上是必要的。那么接线员[](const char*)呢?@Kerrek SB感谢您的见解。今后我将努力不再错过任何细节。原来的操作员很好。您建议的替代品不适用。如果我们要学究,小写字母前的一个字母是不保留的。为什么
(*t1)
而不是简单的
t1
?可读性,习惯,在某些情况下一些编译器会发出警告(我想是叮当声)。我不相信第一个和第三个。当然,第二个取决于你。