8

unsigned long int のような特定の組み込み型への暗黙的なキャストを可能にするクラスを作成しようとしていますが、これを可能な限り正しく実行しようとしているため (これは C++ での最初の重要なプロジェクトです)、奇妙な結果になりました。 const の正確性に関する問題:

これは機能します:

#include <iostream>

class CustomizedInt
{
private:
    int data;
public:
    CustomizedInt();
    CustomizedInt(int input);
    operator unsigned long int () const
    {
        unsigned long int output;
        output = (unsigned long int)data;
        return output;
    }
};

CustomizedInt::CustomizedInt()
{
    this->data = 0;
}

CustomizedInt::CustomizedInt(int input)
{
    this->data = input;
}

int main()
{
    CustomizedInt x;
    unsigned long int y = x;

    std::cout << y << std::endl;

    return 0;
}

でもこれは:

#include <iostream>

class CustomizedInt
{
private:
    int data;
public:
    CustomizedInt();
    CustomizedInt(int input);
    operator unsigned long int () const;
};

CustomizedInt::CustomizedInt()
{
    this->data = 0;
}

CustomizedInt::CustomizedInt(int input)
{
    this->data = input;
}

CustomizedInt::operator unsigned long()
{
    unsigned long int output;
    output = (unsigned long int)data;
    return output;
}

int main()
{
    CustomizedInt x;
    unsigned long int y = x;

    std::cout << y << std::endl;

    return 0;
}

Visual Studio 2010 で次のエラーが表示されます。error C2511: 'CustomizedInt::operator unsigned long(void)' : overloaded member function not found in 'CustomizedInt'

ここで、キーワード const を演算子の定義から削除すると、すべて問題ありません。これはバグですか?現在のオブジェクトを変更しないことを明確に述べるために、各(パブリック)メソッド/演算子の後に const キーワードを使用することになっていることを読みました。

また、そのような演算子を定義するのは適切ではないことはわかっていますが、関連する注意事項を完全に理解しているかどうかはわかりません。誰かそれらの概要を教えてください。ToUnsignedLongInt というパブリック メソッドを定義する方がよいのでしょうか。

4

4 に答える 4

10

関数シグネチャが関数定義と一致しません。

operator unsigned long int () const;

CustomizedInt::operator unsigned long()    { ... }
                                       ^^^
                                   const missing

この場合const、オブジェクトの内部状態に影響を与えないため、変換演算子を as としてマークする必要があります。

また、コンストラクター初期化リストを使用して、メンバー変数を初期化します。

CustomizedInt::CustomizedInt()
: data()
{
}

CustomizedInt::CustomizedInt(int input)
: data(input)
{
}
于 2012-04-23T13:26:43.913 に答える
6

宣言から を削除することもできconstますが、ほぼ確実にやりたいことは、定義に追加することです。

CustomizedInt::operator unsigned long() const
{
    unsigned long int output;
    output = (unsigned long int)data;
    return output;
}
于 2012-04-23T13:24:55.167 に答える
2

はい、メンバー関数がオブジェクトの論理状態に影響を与えない場合はconst、コンパイラがそれを強制するように、実際にそれを で後置する必要があります。

ただし、その場合はconst、関数本体を定義するときにも追加する必要があります!

于 2012-04-23T13:23:54.313 に答える
1

同じ関数プロトタイプを実装にコピーするだけです。すなわち。

CustomizedInt::operator unsigned long int() const
于 2012-04-23T13:28:05.010 に答える