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

Rob*_*cks 1 .net c++ syntax properties visual-c++

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

  • 关于该主题的代码项目文章推荐__property float Volume;过时的,现在归类为/crl:oldSyntax.

  • C++文章Open Standard管理扩展说明定义属性就像property float Volume;自动生成一个我不想要或不需要的支持字段.

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

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

Ste*_*han 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;
}
Run Code Online (Sandbox Code Playgroud)

编辑:一些其他信息:

  • 您可以为getter和setter指定不同的访问修饰符.我修改了源代码以使setter私有化.请注意,与C#不同,如果您使用自动生成后备存储,则无法进行此操作.
  • 之前称为"C++的托管扩展"的是(从Visual Studio 2005开始),称为C++/CLI.它不仅是一个重命名,而是一个完整的新版本.双下划线__property关键字来自托管扩展,现已弃用.