c++ - 如何在没有公共(public)构造函数的情况下拥有自己的字符串类?

标签 c++ string oop

我正在尝试声明我自己的 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 &);
};

我的限制之一是:

There is no need for a public constructor, though you would need a private (or undocumented one). Also, note that this String class will allow us to use optimized memory management.

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

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 行给我一个错误。

最佳答案

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

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

要修复您的直接编译错误,return *this; 有效。但是,您问错了问题。

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

关于c++ - 如何在没有公共(public)构造函数的情况下拥有自己的字符串类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15182098/

相关文章:

c++ - 在 vector 中搜索其第一个参数的所有实例,然后将它们返回到 vector 中

javascript - 如何检查对象属性值是否为带空格的字符串

在 C 中正确比较字符串

php - 当父级公开时,如何将子构造函数设为私有(private)?

c++ - 为什么这个 C++ 程序会打印不相关的字符?

c++ - read、readsome、get 和 getline 之间有什么区别?

c++ - 为什么在这种情况下调用 move 构造函数?

string - QTP - 控制日期是否晚于另一个日期

java - 类和对象的概念

oop - 什么时候使用预定义的类范围访问类型与匿名访问类范围类型作为参数?