我希望使用某些功能扩展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;
}
答案 0 :(得分:10)
String bar = foo;
这是复制初始化(等同于
String bar(String(foo));
),不是作业。您应该为此工作实现复制构造函数(或默认情况下初始化变量,然后将foo
分配给bar
)。
无论如何,从标准C ++类型派生是个坏主意,因为这些类型没有虚拟析构函数。并且组合甚至比继承更好,在你的例子中,你应该使用组合。
答案 1 :(得分:9)
行String bar = foo
不是作业,它实际上等同于String bar(foo)
。如果你写
String bar;
bar = foo;
将按预期调用您的赋值运算符。
答案 2 :(得分:6)
这里的问题是你的行
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 called
答案 3 :(得分:1)
在你的情况下,despte = present,将创建新的String对象,因此需要
String ( const std::string& stdString )
取消评论。 另一种选择是做类似
的事情String bar;
bar = foo;
但这听起来不是一个好主意。
答案 4 :(得分:1)
这样做使用复制构造函数:
String foo("foo");
String foo="hello";//assignment operator here
但这不是:
String foo;
String foo="hello";//copy constructor used here since foo was not initialized
答案 5 :(得分:1)
其他受欢迎的答案是明智的。
为了直接回答你的问题,你正试图这样做。
String& operator= ( const std::string& stdString )
{
// Call the base implementation
return std::string::operator= ( stdString );
}
答案 6 :(得分:1)
std :: string foo =“foo”; 字符串bar = foo;
你在main中尝试的操作不会调用copy assignment operator.它相当于调用copy构造函数。
最好避免继承std :: string,因为它没有定义虚析构函数。