我知道在纯 C++中没有办法做到这一点,但我想知道是否可以在 C++/CLI 中从另一个构造函数的初始化列表中调用构造函数,就像在 C# 中一样。
例子:
ref class Foo {
Foo() {}
Foo(int i) : Foo() {}
}
我知道在纯 C++中没有办法做到这一点,但我想知道是否可以在 C++/CLI 中从另一个构造函数的初始化列表中调用构造函数,就像在 C# 中一样。
例子:
ref class Foo {
Foo() {}
Foo(int i) : Foo() {}
}
它被称为“委托构造函数”。该语言尚不可用。但是有一个正式的提议,你可以在语言规范的附件 F.3.1 中找到它。鉴于微软对 C++/CLI 的立场,这不太可能很快出现。
更新:委托构造函数确实超出了该附件中的提议,它们被添加到标准 C++11 语言规范中。微软一直在努力实现 C++11 的添加。委托构造函数最终成功实现了 VS2013。在该版本中,它们也可以在 C++/CLI 中工作。
您可以执行以下操作
ref class A
{
public:
A(int p) : p(p) { this->A::A(); }
A() : p(1) {}
int p;
};
它不是有效的 C++ 代码,但 VC 可以很好地编译它:)
只是偶然发现,同样的问题。就我而言,我使用的是 VS2010。
很明显,VS2010 永远不会更新以完全实现 C++11,如果您需要更好地遵守标准,请使用 VS2015(我会尽可能地这样做)。但是对于一些(遗留)项目,我仍然必须使用 VS2010。
在许多情况下(对我而言)有效的方法是使用包含所有共享初始化代码的私有函数。例子:
class A
{
private:
void Inidialise() { /* common initialisation here */ }
public:
A() { Initialise(); /* specific initialisation for A() here */ }
A(bool a) { Initialise(); /* specific initialisation for A(bool) here */ }
A(int b) { Initialise(); /* specific initialisation for A(int) here */ }
/* etcetera */
}
它并不能解决所有“问题”,也不能防止所有重复代码的情况,但它还有很长的路要走。
当您说“我知道在纯 C++ 中无法做到这一点”时,您错了。在本机 C++ 中可以做到这一点。您可以使用placement new 运算符来执行此操作。
class A
{
public:
A(int p) : p(p)
{ new(this)A(); }
A() : p(1) {}
int p;
};