如何使用托管C ++中的手写getter / setter定义属性?

时间:2013-03-26 10:38:04

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

我需要在托管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

    < / LI>

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

2 个答案:

答案 0 :(得分:5)

您自己找到了仅限标题的版本。如果要在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指定不同的访问修饰符。我修改了源代码以使setter私有化。 请注意,与C#不同,如果您使用自动生成后备存储,则无法进行此操作。
  • 之前所谓的“C ++托管扩展”现在(从Visual Studio 2005开始)称为C ++ / CLI。它不仅是一个重命名,而是一个完整的新版本。双下划线__property关键字来自托管扩展程序,现已弃用。

答案 1 :(得分:0)

我发现你必须在头文件中声明属性只有ONCE,如下所示:

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

如果您声明属性如下,则会自动生成支持字段:

property float Volume;