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));

)、代入ではありません。これを機能させるには、コピー コンストラクターを実装する必要があります (または、デフォルトで変数を初期化してから に代入fooしますbar)。

とにかく、標準の 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

std::string foo = "foo"; 文字列バー = foo;

main で試行している操作は、コピー代入演算子を呼び出すつもりはありません。これは、コピー コンストラクターを呼び出すことと同じです。

仮想デストラクタを定義していないため、 std::string の継承を避ける方がよいでしょう。

于 2013-04-08T11:33:51.490 に答える
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 に答える