1

タイトルがぼやけてすみません、何かが足りないようです。

とても基本的なように見えるので、私はこれを投稿するのをためらっていましたが、私はそれを機能させることができません。私のIDEは、次のことが正しくないと言っています。ロングダブルと交換したいIRatioというクラスがあります。

class
IRatio
{
    protected:
        long double 
        mValue;

    public:
        IRatio();

        IRatio(
            const IRatio& ir);

        IRatio(
            const long double& ld);

        IRatio&
        operator=(
            const IRatio& ir);

        IRatio&
        operator=(
            const long double& ld);

        operator long double() const;
};

これで、次の行が機能することがわかりました。

IRatio n1(0.01f);
IRatio n2;
n2 = 0.02f;

しかし、驚いたことに、この行は機能しません。

IRatio n3 = 0.03f;

これを機能させるにはどうすればよいですか?この場合、コピーコンストラクターが呼び出されたと思いますか?または、代入演算子であってもかまいません!std::stringがそれを実行できることを私は知っています。

std::string s = "hello!";

ありがとう

4

2 に答える 2

0

コードは機能するはずです。ただし、0.03fタイプはfloatです。あなたは言いたい0.03Lですlong double。しかし、これはここでは必ずしも重要ではなく、floatに変換可能long doubleです。

はい、パラメーター付きのコンストラクターをconst long double&使用して一時IRatioオブジェクトを作成します。このオブジェクトはコピー先にコピーされn3ます(コンパイラーはコピーを最適化する必要があるため、最適化しないように指示しない限り、ここでコピーコンストラクターの呼び出しが表示されない可能性があります。 )。

于 2011-05-07T20:59:46.150 に答える
0

コードはそのまま動作するはずです。とIRatioはいえ、リソースを単独で管理することはないため、コピーコンストラクターと代入演算子は必要ありません。これは行う必要があります:

struct IRatio {
    IRatio() : d(0L) { }
    IRatio(long double d) : d(d) { }
    operator long double() const { return d; }
private:
    long double d;
};

int main(int argc, char* argv[])
{
    IRatio r = 0.02f;
    return 0;
}
于 2011-05-07T21:02:51.740 に答える