如何在 C++/CLI 中设置 non-pointed object 的 属性

How to set a property of a non-pointed object in C++/CLI

这是 C++/CLI 中 class 和 属性 的 header:

    public ref class MyClass
    {
       public:
         property double x
         {
            double get();
            void set(double value);
         }

         MyClass();
     }

如果我使用指针实例化 object 我可以像这样设置 x 属性 :

MyClass^ obj = gcnew MyClass();
obj->x = 10.0;

如果我没有使用指针,那么我有一个编译错误 (C2228:'.x' 的左侧必须有 class/struct/union)使用此代码:

MyClass obj();
obj.x = 10.0; 

第二个例子怎么办?

此语法问题是否特定于属性或 non-pointed object 的任何成员?

第二种语法称为堆栈语义。当变量超出范围时,它会创建对象并 "destroys" 它。

其实不是释放内存,而是对象调用了Dispose

因此使用句点而不是指针运算符的第二种语法 -> 仅是具有堆栈语义的有效 vor 对象。

另见 https://msdn.microsoft.com/en-us/library/ms177191.aspx

你刚刚被 most vexing parse 困住了:

MyClass obj();

这个没有定义类型MyClass的变量obj。如果声明一个不带参数的 函数 obj 和 returns MyClass.

只写这个:

MyClass obj;
obj.x = 10.0;

或者这样:

MyClass obj{};
obj.x = 10.0;

两者都编译得很好。

obj 使用 stack semantics 尽管 MyClass 没有实现 IDisposable(即在 C++/CLI 中没有 ~MyClass 成员)。