以下是具有C ++ / CLI属性的类的标题:
public ref class MyClass
{
public:
property double x
{
double get();
void set(double value);
}
MyClass();
}
如果我使用指针实例化对象,我可以像这样设置x
属性:
MyClass^ obj = gcnew MyClass();
obj->x = 10.0;
如果我不使用指针,那么我有一个编译错误 (C2228:'。x'的左边必须有class / struct / union)使用以下代码:
MyClass obj();
obj.x = 10.0;
我应该为第二个例子做些什么?
此语法问题是特定于属性还是特定于非指向对象的任何成员?
答案 0 :(得分:4)
你刚刚被most vexing parse:
困住了MyClass obj();
此不定义obj
类型的变量MyClass
。如果声明函数 obj
不带参数并返回MyClass
。
只需写下来:
MyClass obj;
obj.x = 10.0;
或者这个:
MyClass obj{};
obj.x = 10.0;
两者都编译得很好。
obj
使用stack semantics尽管MyClass
没有实现IDisposable
(即在C ++ / CLI中没有~MyClass
成员)。
答案 1 :(得分:0)
第二种语法称为堆栈语义。它创造了对象并且"破坏"它,当变量超出范围时。
实际上并没有释放内存,而是为对象调用Dispose。
所以使用句点而不是指针运算符的第二种语法 - >只是具有堆栈语义的有效vor对象。