Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在托管C+中使用手写的getter/setter定义属性+;? 我需要在托管C++项目中定义手写吸气剂/设置器的属性,在一个可以从C .net项目中使用的类中。_C++_.net_Visual C++_Syntax_Properties - Fatal编程技术网

如何在托管C+中使用手写的getter/setter定义属性+;? 我需要在托管C++项目中定义手写吸气剂/设置器的属性,在一个可以从C .net项目中使用的类中。

如何在托管C+中使用手写的getter/setter定义属性+;? 我需要在托管C++项目中定义手写吸气剂/设置器的属性,在一个可以从C .net项目中使用的类中。,c++,.net,visual-c++,syntax,properties,C++,.net,Visual C++,Syntax,Properties,关于该主题的专家建议\uuu财产浮动量已过时,现在分类为/crl:oldSyntax 定义属性,如属性浮动体积自动生成我不想要或不需要的支持字段 简单地定义属性,如属性浮动体积可以使用/clr进行良好编译,但尝试添加手写的getter/setter,如浮点混合器::Volume::get(){..}throw错误C2084:函数X已经有一个主体 那么,使用自定义的手写getter/setter方法定义只读或读/写属性的正确方法是什么呢?我发现您只需在头文件中声明一次属性,如下所示: prope

关于该主题的专家建议
\uuu财产浮动量
已过时,现在分类为
/crl:oldSyntax

  • 定义属性,如
    属性浮动体积自动生成我不想要或不需要的支持字段

  • 简单地定义属性,如
    属性浮动体积
    可以使用
    /clr
    进行良好编译,但尝试添加手写的getter/setter,如
    浮点混合器::Volume::get(){..}
    throw
    错误C2084:函数X已经有一个主体


  • 那么,使用自定义的手写getter/setter方法定义只读或读/写属性的正确方法是什么呢?

    我发现您只需在头文件中声明一次属性,如下所示:

    property float Volume {
        float get() {
            return 0;
        }
        void set(float value) {
        }
    }
    
    ///////////////////////
    // Foo.h:
    ///////////////////////
    ref struct Foo
    { 
        property float Volume
        {
            float get();
            private: void set(float value);
        }
    private:
        float m_backingField;
    }
    
    ///////////////////////
    // Foo.cpp:
    ///////////////////////
    float Foo::Volume::get()
    {
        return m_backingField;
    }
    
    void Foo::Volume::set(float value)
    {
        m_backingField = value;
    }
    
    如果按如下方式声明属性,将自动生成支持字段:

    property float Volume;
    

    我发现您只需在头文件中声明一次属性,如下所示:

    property float Volume {
        float get() {
            return 0;
        }
        void set(float value) {
        }
    }
    
    ///////////////////////
    // Foo.h:
    ///////////////////////
    ref struct Foo
    { 
        property float Volume
        {
            float get();
            private: void set(float value);
        }
    private:
        float m_backingField;
    }
    
    ///////////////////////
    // Foo.cpp:
    ///////////////////////
    float Foo::Volume::get()
    {
        return m_backingField;
    }
    
    void Foo::Volume::set(float value)
    {
        m_backingField = value;
    }
    
    如果按如下方式声明属性,将自动生成支持字段:

    property float Volume;
    

    您自己已经找到了仅标题的版本。如果要在cpp文件中实现getter和setter,语法如下:

    property float Volume {
        float get() {
            return 0;
        }
        void set(float value) {
        }
    }
    
    ///////////////////////
    // Foo.h:
    ///////////////////////
    ref struct Foo
    { 
        property float Volume
        {
            float get();
            private: void set(float value);
        }
    private:
        float m_backingField;
    }
    
    ///////////////////////
    // Foo.cpp:
    ///////////////////////
    float Foo::Volume::get()
    {
        return m_backingField;
    }
    
    void Foo::Volume::set(float value)
    {
        m_backingField = value;
    }
    
    编辑:一些附加信息

    • 可以为getter和setter指定不同的访问修饰符。我修改了源代码以使setter私有请注意,与C#中不同,如果使用自动生成备份存储,则不可能实现此功能。
    • 早期称为“C++托管扩展”的内容现在(从VisualStudio2005开始)称为C++/CLI。这不仅是一次更名,而且是一次全新的修订。双下划线
      \u属性
      关键字来自托管扩展,现在已被弃用

    您已经自己找到了仅标题的版本。如果要在cpp文件中实现getter和setter,语法如下:

    property float Volume {
        float get() {
            return 0;
        }
        void set(float value) {
        }
    }
    
    ///////////////////////
    // Foo.h:
    ///////////////////////
    ref struct Foo
    { 
        property float Volume
        {
            float get();
            private: void set(float value);
        }
    private:
        float m_backingField;
    }
    
    ///////////////////////
    // Foo.cpp:
    ///////////////////////
    float Foo::Volume::get()
    {
        return m_backingField;
    }
    
    void Foo::Volume::set(float value)
    {
        m_backingField = value;
    }
    
    编辑:一些附加信息

    • 可以为getter和setter指定不同的访问修饰符。我修改了源代码以使setter私有请注意,与C#中不同,如果使用自动生成备份存储,则不可能实现此功能。
    • 早期称为“C++托管扩展”的内容现在(从VisualStudio2005开始)称为C++/CLI。这不仅是一次更名,而且是一次全新的修订。双下划线
      \u属性
      关键字来自托管扩展,现在已被弃用

    如果不想提供set属性,则无需使用
    private:
    。只是不要执行
    set
    ~@Ajay:你是对的。有些情况下不需要设置器(想象一下
    DateTime.Now
    有一个设置器)。但当属性与备份存储一起使用时,如示例中所示,我将实现setter。如果不想提供set属性,则无需使用
    private:
    。只是不要执行
    set
    ~@Ajay:你是对的。有些情况下不需要设置器(想象一下
    DateTime.Now
    有一个设置器)。但是,当该属性与备份存储一起使用时(如示例中所示),我将实现setter。