0

演算子のオーバーロードではおそらく不可能なことをしようとしています。私は特に、右側の値として別のデータ型の値を受け取る代入演算子のオーバーロードに興味があります。次のようになります。

MyClass myclass = "hello world";    <--- Wrong?

MyClass myclass2;
Myclass myclass = myclass2;         <--- Right?

次に、MyClassオブジェクトは文字列を受け取り、それを処理する必要があります。残念ながら、私が読んだことによると、同じデータ型の値をカスタムメイドのクラスに割り当てることしかできません。それは本当ですか、それとも私が間違っていましたか?

これは私が現在持っているコードです:

class MyClass {
public:
    MyClass() {};
    virtual ~MyClass();
    MyClass& operator = (const MyClass&);
private:
    char* string;
};

MyClass& MyClass::operator= (const MyClass& inc){
    string = inc;
}

int main(int argc, char** argv) {
    MyClass myclass = "hello world";
    std::cout << myclass;
}

ご覧のとおりcout、文字列としてのオブジェクトも必要です。基本的に、カスタム クラスを文字列として扱いたいと考えています。Google および StackOverflow 検索エンジンでの検索で私の希望が拒否されましたが、実際にそうなっているのでしょうか、それとも回避策はありますか?

ご連絡をお待ちしております。事前にご連絡いただきありがとうございます。


編集:ローリーは主な問題を修正しました。coutしかし、カスタム オブジェクトの文字列値はどうすればよいでしょうMyClassか。オブジェクト出力は出力されるオブジェクトのメモリアドレスに過ぎないので、それは可能ですか?

4

1 に答える 1

3

MyClass myclass = "hello world";は代入ではありません。これはコンストラクターであり、論理的には と同等MyClass myclass("hello world");です。コンストラクターと代入演算子の両方をオーバーロードすると、探している動作が得られます!

また、いくつかのコメント:

1) メンバー変数に名前を付けるのは良い考えではありませんstring- これは非常に一般的な STL 型の名前です

2) この変数を直接設定するのは時限爆弾です。文字列の値をコピーしているのではなく、ポインタをコピーしているだけです。std::stringコピーが自動的に行われるように切り替えます

3)cout適切に動作させるには、stackoverflow.com/questions/5508857/how-does-cout-actually-work で回答を参照してください。

于 2013-07-25T19:02:00.873 に答える