2015-07-21 70 views
-1

我已经冲刷谷歌和计算器了这么远没有明确的答案,所以我直接问...重载运算符=或operator []的使用const char *与/或串

我创建了一个位图字体类,我想使用赋值运算符:operator =(const char *)将字符串文字分配给类的文本。 注:我也想用字符串,字符串*与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定义:

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

这是为什么我可以指定一个字符数组string类?因为它似乎继承了char的特性?如果没有这么复杂的实现,我可以重载我想要的方式吗?我想第二个问题是(我认为)沿着同样的路线: 我想使用运算符[](const char * _name)返回名称匹配_name值的子对象。

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

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

+0

WTF? 't1'是一个指针...你不能为非用户定义的类型重载操作符,而指针也不是用户定义的类型。 –

+0

你忘记解除引用t1。尝试'* t1 =“Hello World”;' –

+2

您可能想要'BitmapText t1; t1 =“Hello World”;'。除非真的需要这样做,否则不要动态分配东西。 – Praetorian

回答

4

定义操作员通过以下方式

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

    return *this; 
} 

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

至于这个代码片断

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

那么它被改写如下方式

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

本声明

t1 = "Hello World"; 

是错误的,因为你想分配类型为const char *的指针指向BitmapText *类型的指针。

+0

char ** const ** * –

4

您正试图分配给t1,这不是BitmapText,而是指向BitmapText的指针;

如果你这样做*t1 = "Hello World";它应该工作。

+0

谢谢!这工作!我花了几个小时去忘记明显的... – hwill

0

您试图将指定给一个指针,一个字符串文字的地址。 而是尝试:

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

原来的运营商很好。你建议的替代品不是。如果我们要迂腐,小写字母前的单个_不被保留。 –

+0

为什么'(* t1)'而不是简单的't1'? –

+0

可读性,习惯,在某些情况下,一些编译器会发出警告(我认为是叮当声)。 –