1

Stringstd::stringクラスを模倣する独自のクラスを宣言しようとしています。以下はStringクラスです。

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

私が持っている制約の1つはこれです:

プライベート(または文書化されていないコンストラクター)が必要になりますが、パブリックコンストラクターは必要ありません。また、この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 に答える