如何在C ++ / CLI中将重载的构造函数调用转发给另一个构造函数

时间:2010-03-01 16:00:24

标签: visual-c++ c++-cli delegating-constructor

我知道在pure C++中无法做到这一点,但我想知道是否可以从C ++ / CLI中的另一个构造函数的初始化列表中调用构造函数,就像在C#中可以这样做一样

示例:

ref class Foo {
  Foo() {}
  Foo(int i) : Foo() {}
}

4 个答案:

答案 0 :(得分:14)

它被称为“委托构造函数”。目前还没有该语言版本。但是有一个正式的提案,你可以在language specification的附件F.3.1中找到它。考虑到微软对C ++ / CLI的立场,不太可能很快就能看到光明。


更新:委托构造函数确实超出了该附件中的提议,它们被添加到标准C ++ 11语言规范中。 Microsoft一直致力于实现C ++ 11的增加。委托构造函数最终成功用于VS2013。他们也在该版本的C ++ / CLI中工作。

答案 1 :(得分:1)

您可以执行以下操作

ref class A
{
public:
    A(int p) : p(p) { this->A::A(); }
    A() : p(1) {}

    int p;
};

它不是有效的C ++代码,但VC编译得很好:)

答案 2 :(得分:0)

对于同样的问题,偶然发现了。就我而言,我正在使用VS2010。

很明显VS2010永远不会更新以完全实现C ++ 11,如果你需要更好地遵守标准(我尽我所能),请使用VS2015。但对于一些(遗留)项目,我仍然需要使用VS2010。

在许多情况下(对我来说)有效的方法是使用包含所有共享初始化代码的私有函数。例如:

{{1}}

它并没有解决所有“问题”,也没有阻止所有重复代码的情况,但它还有很长的路要走。

答案 3 :(得分:-5)

当你说 “我知道在纯C ++中无法做到这一点” 时你出错了。可以在本机C ++中执行此操作。您可以使用placement new运算符来执行此操作。

class A 
{ 

public:

   A(int p) : p(p) 
   { new(this)A(); }

   A() : p(1) {}      

   int p; 
};