【问题标题】:How to define properties with a handwritten getter/setter in managed C++?如何在托管 C++ 中使用手写的 getter/setter 定义属性?
【发布时间】:2013-03-16 02:56:01
【问题描述】:

我需要在托管 C++ 项目中使用手写的 getter/setter 定义属性,该类可用于 C# .NET 项目。

  • 主题上的codeproject article推荐__property float Volume;已过时,现在归类为/crl:oldSyntax

  • Open Standard managed extensions to C++ article 表示定义像property float Volume; 这样的属性会自动生成一个支持字段,这是我不想要或不需要的。

  • 简单地定义像property float Volume; 这样的属性可以用/clr 很好地编译,但是尝试添加像float Mixer::Volume::get(){ .. } 这样的手写getter/setter 抛出Error C2084: function X already has a body

那么,在没有支持字段的情况下,以及使用自定义构建的手写 getter/setter 方法来定义只读或读/写属性的正确方法是什么?

【问题讨论】:

    标签: c++ .net visual-c++ syntax properties


    【解决方案1】:

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

    ///////////////////////
    // 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 指定不同的访问修饰符。我修改了源代码以使设置器私有。 请注意,与 C# 不同,如果您使用自动生成后备存储,这是不可能的。
    • 之前称为“C++ 的托管扩展”,现在(从 Visual Studio 2005 开始)称为 C++/CLI。这不仅是更名,而且是全新的修订。双下划线 __property 关键字来自托管扩展,现已弃用。

    【讨论】:

    • 如果您不想提供 set-property,则无需使用private:。只是不要实现set ~
    • @Ajay:你是对的。在某些情况下不需要设置器(想象DateTime.Now 有一个设置器)。但是当属性与后备存储一起使用时,如示例中所示,我将实现 setter。
    【解决方案2】:

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

    property float Volume {
        float get() {
            return 0;
        }
        void set(float value) {
        }
    }
    

    如果你像下面这样声明属性,则会自动生成一个支持字段:

    property float Volume;
    

    【讨论】:

      猜你喜欢
      • 2012-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-08
      • 1970-01-01
      • 1970-01-01
      • 2017-03-31
      相关资源
      最近更新 更多