1

我正在尝试声明我自己的String类来模仿 std::string 类。下面是String课堂。

class String {
    public:
        // Copy constructor.
        String(const String &);
        // Conversion to std::string.
        operator std::string() const;
        // Assignment.
        String &operator=(const String &);
};

我的限制之一是:

不需要公共构造函数,尽管您需要一个私有的(或未记录的)。另外,请注意,此类String将允许我们使用优化的内存管理。

我对突出显示的行感到困惑。我试图实现如下:

class String: public std::string {
    private:
        String();
        String *s;
    public:

        // Copy constructor.
        String(const String &a) {
            s = a.s;
        };
        // Conversion to std::string.
        operator std::string() const {
            return this;
        };
        // Assignment.
        String& operator=(const String &a) {
            if(this != &a) {
                s=a.s;
            }
            return *this;
        };
};

但我面临这种方法的问题,因为这是错误的。我做错了什么,实现它的正确方法是什么?

主要问题是将我的String对象转换为std::string. 这个怎么做?return this行给了我一个错误。

4

1 回答 1

6

从一个类继承通常是不好的做法,std::string原因有几个,包括它有一个非虚拟析构函数,所以有人可以有一个指针std::string,但没有意识到它实际上是一个指向你的指针,删除它,你的析构函数永远不会被调用。

std::string你的类有状态,所以它需要一个析构函数,所以不允许继承。

要修复您的即时编译错误,return *this;可以使用。然而,你问错了问题。

不要这样做:永远class String: public std::string。(嗯,几乎永远——我可以构建一个理由,但这不是一个好的理由)

于 2013-03-03T03:36:54.627 回答