我想用一些功能来扩展std::string,所以我从它派生出我的String。为了让像String str = stdStr;这样的代码工作,我试图重载赋值操作符,但由于某种原因,我的代码没有被调用。我怎么才能修复它?
#include <string>
class String
:
public std::string
{
public:
/*
I do know that this constructor will solve the problem, but is it possible to use the operator?
String ( const std::string& stdString )
{
...
}
*/
String& operator= ( const std::string& stdString )
{
...
return *this;
}
};
int main()
{
std::string foo = "foo";
String bar = foo;
return 1;
}发布于 2013-04-08 18:51:15
String bar = foo;它是复制初始化(等同于
String bar(String(foo));),而不是赋值。你应该为这个工程实现复制构造函数(或者在默认情况下初始化变量,然后将foo赋给bar)。
无论如何,从标准C++类型派生是不好的,因为这些类型没有虚拟析构函数。组合甚至比继承更好,在你的例子中,你应该使用组合。
发布于 2013-04-08 18:51:28
行String bar = foo it不是一个赋值,它实际上等同于String bar(foo)。如果你写
String bar;
bar = foo;您的赋值操作符将被调用,正如预期的那样。
发布于 2013-04-08 18:53:48
这里的问题是你的线路
String bar = foo;不调用赋值运算符,因为您没有要赋值的对象(bar尚未创建);它调用一个构造函数。实际上,如果您的注释掉的构造函数可用,它会调用它。
如果你真的想使用你的运算符,你必须写:
String bar;
bar = foo; // Now bar exists and you can assign to it顺便说一句,从std::string继承并不是一个好主意,因为这个类和标准库中的大多数其他类一样,并不是被设计为从继承的。具体地说,它缺少虚拟析构函数,如果您以多态方式使用它,这将带来麻烦,例如:
std::string* str = new String();
delete str; // Oops; the wrong destructor will be calledhttps://stackoverflow.com/questions/15877196
复制相似问题