Microsoft c++ __declspec(property({get|put}))特殊属性_c++中declspec(property)在linux下怎么用-CSDN博客

概念:

__declspec是microsofr C++专用修饰符,详细信息请参考官方文档

地址:__declspec | Microsoft Docs

场景:

当我们需要对class/struct中的成员变量进行访问时,能不能像C#那样像访问成员变量一样,而不是调用getter/setter这样的函数,这样可以提高代码的简洁性和可读性。那么我们可以通过__declspec(property({get|put}))来实现。

实现

我们定义类/结构体

struct PropertyCase
{
private:
    std::string data; //实际存储
public:
    //getter
    std::string getData() const
    {
        //对data数据进行处理
        return data;
    }
    //setter
    void setData(int64_t d)
    {
        data = std::to_string(d);
    }
    void setData(double d)
    {
        data = std::to_string(d);
    }
    void setData(bool d)
    {
        data = d ? "true" : "false";
    }
    void setData(std::string d)
    {
        data = d;
    }

    void setData(const char* d)
    {
        data = d;
    }

    __declspec(property(get = getData, put = setData)) std::string m_data; //用户访问

};

1.__declspec(property(get = getData, put = setData)) 其中get和put属性并不是必须全部包含,当只需要读取时 只需要指定get,当只需要存储时只需要put.如果没有指定相应的属性函数,在进行相应操作时编译报错

2.定义m_data类型应与get接口返回类型一致,当没有get属性时可以时任意非无类型类型(void)

3.定义的m_data实际并不影响类或结构体的实际大小

4.m_dala在getter/setter中应用实际是调用的getter/setter函数自身,如果没有推出条件,会递归到栈溢出

调用结果

int main()
{

    PropertyCase pc;
    std::cout << "size = " << sizeof(PropertyCase) << std::endl;
    pc.m_data = 12LL;
    std::cout << "pc.m_data = " << pc.m_data << std::endl;
    pc.m_data = 12.1;
    std::cout << "pc.m_data = " << pc.m_data << std::endl;
    pc.m_data = "PropertyCase";
    std::cout << "pc.m_data = " << pc.m_data << std::endl;
    pc.m_data = true;
    std::cout << "pc.m_data = " << pc.m_data << std::endl;

    return 0;

}

总结

__declspec(property({get|put})) 使我们可以像访问成员变量一样访问成员函数对成员变量进行getter和setter,使变量的访问更加透明,,提高了代码的可读性,简化函数调用


原网址: 访问
创建于: 2024-05-28 09:52:46
目录: default
标签: 无

请先后发表评论
  • 最新评论
  • 总共0条评论