• windows下 C++ 实现类属性的get和set方式


    目录

    通用的方式

    Windows平台方式:

    属性 (C++)

    注意:

     用法:

    使用类模板的方式: 

     用法:

    实验代码: 

    结果:

    自己的想法:


    通用的方式

    C#的语法中自带类属性的get和set方式,可以很优雅的读写属性.在C++中要是向使用,通俗的写法是写内联函数,{C++在类的内部实现的函数默认为内联函数}

    例如:

    1. class MyClass
    2. {
    3. public:
    4. int GetValue() { return _value; }
    5. void SetValue(int num) { _value = num; }
    6. string GetStrValue() { return _strValue; }
    7. void SetValue(string str) { _strValue = str; }
    8. private:
    9. int _value;
    10. string _strValue;
    11. };

    这是最简单的,也是最通用的不区分平台.

    Windows平台方式:

    在Windows系统下使用VS IED有种方式可以实现和C#属性的用法类似的方式:

    属性 (C++) | Microsoft Docs 微软的文档

    属性 (C++)

    Microsoft 专用

    此特性可应用于类或结构定义中的非静态“虚拟数据成员”。 编译器通过将这些“虚拟数据成员”的引用更改为函数调用来将其作为数据成员处理。

    注意:

    第一个类是普通的类,只要在通用的方式添加两行代码就可以实现

    1. __declspec(property(get = GetValue, put = SetValue)) int value;
    2. __declspec(property(get = GetStrValue, put = SetValue)) string strValue;

    这行语法的内容是,只有 __declspec(property(get = GetValue, put = SetValue)) int value;

    红色的你自己写的内联函数,紫色的是定义的属性,也就是你读写的时候的值;

     用法:

    1. MyClass myc;
    2. myc.value = 10;
    3. myc.strValue = "hello world";
    4. cout << myc.value << endl;
    5. cout << myc.strValue << endl;

    使用类模板的方式: 

    1. template <typename T>
    2. class MyTempClass
    3. {
    4. public:
    5. T GetValue() { return _value; }
    6. void SetValue(T num) { _value = num; }
    7. __declspec(property(get = GetValue, put = SetValue)) T value;
    8. private:
    9. T _value;
    10. };

     用法:

    1. MyTempClass<int> Mytc;
    2. Mytc.value = 20;
    3. cout << Mytc.value << endl;
    4. MyTempClass strMytc;
    5. strMytc.value = "qwert";
    6. cout << strMytc.value << endl;
    7. MyTempClass<double> dMytc;
    8. dMytc.value = 3.1415;
    9. cout << dMytc.value << endl;

    实验代码: 

    1. // CppGetSet.cpp : Defines the entry point for the console application.
    2. //
    3. #include "stdafx.h"
    4. #include
    5. #include
    6. using namespace std;
    7. class MyClass
    8. {
    9. public:
    10. int GetValue() { return _value; }
    11. void SetValue(int num) { _value = num; }
    12. string GetStrValue() { return _strValue; }
    13. void SetValue(string str) { _strValue = str; }
    14. __declspec(property(get = GetValue, put = SetValue)) int value;
    15. __declspec(property(get = GetStrValue, put = SetValue)) string strValue;
    16. private:
    17. int _value;
    18. string _strValue;
    19. };
    20. template <typename T>
    21. class MyTempClass
    22. {
    23. public:
    24. T GetValue() { return _value; }
    25. void SetValue(T num) { _value = num; }
    26. __declspec(property(get = GetValue, put = SetValue)) T value;
    27. private:
    28. T _value;
    29. };
    30. int main()
    31. {
    32. MyClass myc;
    33. myc.value = 10;
    34. myc.strValue = "hello world";
    35. cout << myc.value << endl;
    36. cout << myc.strValue << endl;
    37. MyTempClass<int> Mytc;
    38. Mytc.value = 20;
    39. cout << Mytc.value << endl;
    40. MyTempClass strMytc;
    41. strMytc.value = "qwert";
    42. cout << strMytc.value << endl;
    43. MyTempClass<double> dMytc;
    44. dMytc.value = 3.1415;
    45. cout << dMytc.value << endl;
    46. return 0;
    47. }

    结果:

    自己的想法:

    虽然说这种方式很好用,但是个人认为并不是很好.因为这个方法只适用于Windows平台,要是使用跨平台的时候是不可以的,若只是在Windows平台下用,这个方式很是很值得推荐的,但是要是在Linux平台下使用,可能会编译过不(没有试过,).

  • 相关阅读:
    Viola-Jones检测器(VJ)---学习笔记
    智能反射面辅助的物理层安全技术综述
    STM32驱动HC05蓝牙串口通信模块
    qt生成帮助文档过程
    LeetCode 1408. 数组中的字符串匹配
    【每日前端面经】2023-02-23
    golang设计模式——装饰器模式
    Qt-FFmpeg开发-回调函数读取数据(8)
    PDF删除页面免费的方法有什么?PDF怎么删除页面的技巧你不能错过
    C#性能优化-树形结构递归优化
  • 原文地址:https://blog.csdn.net/m0_38036750/article/details/126137263