7

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

例子:

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

4 回答 4

16

它被称为“委托构造函数”。该语言尚不可用。但是有一个正式的提议,你可以在语言规范的附件 F.3.1 中找到它。鉴于微软对 C++/CLI 的立场,这不太可能很快出现。


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

于 2010-03-01T17:37:09.413 回答
2

您可以执行以下操作

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

    int p;
};

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

于 2011-10-27T15:50:00.367 回答
0

只是偶然发现,同样的问题。就我而言,我使用的是 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 */

}

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

于 2016-02-21T11:22:31.287 回答
-4

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

class A 
{ 

public:

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

   A() : p(1) {}      

   int p; 
};
于 2012-08-25T00:31:34.313 回答