0

アクセス用のドット表記を維持しながら、C++ のプロパティを使用して、メソッドで変数を設定できると考えました。私が間違っている?

class Class {
private:
    int _number;

    void putNumber(int number) {
        if (number < 10) _number = 0;
        else _number = number;
    }

    int getNumber() {
        return _number;
    }

public:
    __declspec(property(get = getNumber,put = putNumber)) int number;
};

main()
{
    Class classObj;
    classObj.number = 2;
    std::cout << classObj.number;
}

ソースコードは 0 を出力すべきではありませんか? それは2を出力しますが..

求めている効果を得るにはどうすればよいですか?ドット表記を維持しながら、アクセスのためにセッターとゲッターを経由するのですか?

4

2 に答える 2

1

誰もが正しいですが、Visual Studio でコンパイルしていて、他の OS で実行することを気にしないのであれば、標準ではありません。VS でコンパイルしている場合は、次のエラーが発生するはずです。

Error   1   error C2248: 'Class::putNumber' : cannot access private member declared in class 'Class'    

getter/setter メソッドはプライベートであるため、アクセスできません。コードを次のように変更する必要があります。

class Class {
private:
    int _number;
public:

    void putNumber(int number) {
        if (number < 10) _number = 0;
        else _number = number;
    }

    int getNumber() {
        return _number;
    }

    __declspec(property(get = getNumber,put = putNumber)) int number;
};

コンパイル エラーがないことから判断すると、Visual Studio でコンパイルしていないと思われます。

于 2013-06-03T22:27:05.203 に答える
0

ドキュメントによると、「仮想メンバー」へのアクセスは、アクセサー関数の呼び出しに変換されます。

これは、呼び出し元がアクセサー関数にアクセスできる必要があることを示唆しています。公開してみては?

于 2013-06-03T22:26:27.227 に答える