我知道有没有办法在pure C++做到这一点,但我想知道是否有可能调用在C++/CLI的另一个构造函数的初始化列表构造,在C#中也可以这样做。如何重载构造函数调用转发给下再构造++/CLI
实施例:
ref class Foo {
Foo() {}
Foo(int i) : Foo() {}
}
我知道有没有办法在pure C++做到这一点,但我想知道是否有可能调用在C++/CLI的另一个构造函数的初始化列表构造,在C#中也可以这样做。如何重载构造函数调用转发给下再构造++/CLI
实施例:
ref class Foo {
Foo() {}
Foo(int i) : Foo() {}
}
它被称为 “委托构造函数”。目前尚未在语言中提供。但是有一个正式的提案,你可以在language specification的附录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编译它精细:)
当你说“我知道有没有办法做到这一点纯粹的C++“你错了。在原生C++中可以这样做。您可以使用展示位置新操作员来执行此操作。
class A
{
public:
A(int p) : p(p)
{ new(this)A(); }
A() : p(1) {}
int p;
};
错误。 http://www.parashift.com/c++-faq-lite/init-methods.html – user634175 2012-08-28 12:52:16
这是错误的。 – Puppy 2013-05-27 15:39:33
只是偶然发现,对于同一个问题。在我的情况下,我使用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++ 0x将支持这一点,其实 – sellibitze 2010-09-22 07:17:23