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