1

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

  • 关于该主题的codeproject 文章建议使用__property float Volume;已过时且现在归类为/crl:oldSyntax.

  • Open Standard managed extensions to C++ 文章说定义属性,如自动property float Volume;生成支持字段,我不想要或不需要。

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

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

4

2 回答 2

6

您自己找到了仅标题版本。如果你想在一个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关键字来自托管扩展,现已弃用。
于 2013-03-26T11:36:03.580 回答
0

好吧,我发现您必须在头文件中仅声明一次属性,如下所示:

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

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

property float Volume;
于 2013-03-26T11:07:46.180 回答