1

我想扩展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;

}
4

7 回答 7

10
String bar = foo;

它是复制初始化(相当于

String bar(String(foo));

),而不是赋值。您应该为此工作实现复制构造函数(或默认初始化变量然后分配foobar)。

无论如何,从标准 C++ 类型派生是个坏主意,因为这些类型没有虚拟析构函数。组合比继承更好,在你的例子中,你应该使用组合。

于 2013-04-08T10:51:14.820 回答
9

它不是赋值的那一行String bar = foo,它实际上是等价于String bar(foo). 如果你写

String bar;
bar = foo;

正如预期的那样,您的赋值运算符将被调用。

于 2013-04-08T10:51:27.640 回答
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
于 2013-04-08T10:53:47.827 回答
1

在您的情况下,despte = present,将创建新的 String 对象,因此需要

String ( const std::string& stdString )  

取消注释。另一种选择是做类似的事情

String bar;  
bar = foo;  

但这听起来不是一个好主意。

于 2013-04-08T10:51:34.283 回答
1

这样做使用复制构造函数:

String foo("foo");
String foo="hello";//assignment operator here

但这不会:

String foo;
String foo="hello";//copy constructor used here since foo was not initialized
于 2013-04-08T10:54:27.853 回答
1

其他赞成的答案是消息灵通的。

为了直接回答您的问题,您正在尝试这样做。

    String& operator= ( const std::string& stdString )
    {
        // Call the base implementation
        return std::string::operator= ( stdString );
    }
于 2013-04-08T10:55:17.383 回答
1

std::string foo = "foo"; 字符串 bar = foo;

您在 main 中尝试的操作不会调用复制赋值运算符。它相当于调用复制构造函数。

最好避免继承 std::string 因为它没有定义虚拟析构函数。

于 2013-04-08T11:33:51.490 回答