c ++属性不通过方法?

时间:2013-06-03 22:17:55

标签: visual-c++

我认为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虽然..

我怎样才能达到我想要的效果?保持点符号但通过setter和getter进行访问?

2 个答案:

答案 0 :(得分:1)

虽然每个人都是正确的,但它不是标准的,如果您正在使用Visual Studio进行编译,并且您不关心在任何其他操作系统上运行,请继续。如果你正在编译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中编译。

答案 1 :(得分:0)

根据the documentation,对“虚拟成员”的访问将转换为对访问者功能的调用。

这表明调用者需要访问访问者功能。试着把它们公开吗?