问题标签 [delegating-constructor]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
373 浏览

c++ - 具有聚合初始化的 C++11 构造函数委托

是否可以在我自己定义的默认 ctor 中调用聚合初始化?

GCC 使用以下代码抱怨“错误:构造函数委托给自身”:

memset(this, 0, sizeof(*this))目前正在 ctor 体内使用。

0 投票
1 回答
683 浏览

c++ - 构造函数在 g++ 和 clang++ 中委托给自身

考虑以下程序。我不小心弄错了。

上面的代码在某些版本的 g++ 中编译和运行良好,例如 g++ 4.8.1(参见此处的实时演示)和 clang++ 3.6.0(参见此处的实时演示)和 MSVC++ 2015,但在运行时崩溃。它给了我分段错误错误。我认为这是由于递归,我的意思是递归调用构造函数。但是最新版本的 g++ 和 clang++ 无法通过给出以下错误来编译此代码:

g++ 4.9.2 给出以下错误(请参见此处的实时演示)

clang++ 给出以下错误(请参见此处的实时演示)

那么,这里的问题是根据标准哪个编译器就在这里?它是这些编译器之一中的错误吗?在上面的程序中到底发生了什么?纠正我如果我的理解有误。为什么同一个程序在这些编译器的不同版本中表现出不同的行为?

0 投票
3 回答
3415 浏览

c++ - 如何处理必须以异常安全的方式获取多个资源的构造函数

我有一个拥有多种资源的重要类型。如何以异常安全的方式构造它?

例如,这里有一个演示类X,它包含一个数组A

现在这个特定类的明显答案是使用std::vector<A>. 这是个好建议。但这X只是更复杂的场景的替代品,其中X必须拥有多个资源,并且使用“使用 std::lib”的好建议并不方便。我选择用这个数据结构来交流这个问题仅仅是因为它很熟悉。

非常清楚:如果您可以设计您X的默认值以~X()正确清理所有内容(“零规则”),或者~X()只需要释放单个资源,那么这是最好的。但是,在现实生活中有时~X()必须处理多种资源,而这个问题解决了这些情况。

所以这个类型已经有了一个很好的析构函数和一个很好的默认构造函数。我的问题集中在一个重要的构造函数上,它需要两个A,为它们分配空间并构造它们:

我有一个完全仪器化的测试类A,如果这个构造函数没有抛出异常,它工作得很好。例如,使用此测试驱动程序:

输出是:

我有 4 个构造和 4 个破坏,每个破坏都有一个匹配的构造函数。一切都很好。

但是,如果 的复制构造函数A{2}抛出异常,我会得到以下输出:

现在我有 3 个结构,但只有 2 个破坏。结果泄露AA(A const& a): 1

解决此问题的一种方法是将构造函数与try/catch. 然而,这种方法是不可扩展的。在每次分配资源之后,我需要另一个嵌套try/catch来测试下一个资源分配并取消分配已经分配的内容。握住鼻子:

这正确输出:

但这很丑! 如果有 4 个资源呢?还是400?! 如果在编译时不知道资源数量怎么办?!

有没有更好的方法?

0 投票
2 回答
833 浏览

c++ - 多重继承中没有匹配函数

我是 C++ 继承的新手,并决定尝试一些实验来了解这个主题。

下面的代码显示了我正在创建的类的层次结构:

类.h

类.c

编译器向我显示消息:

没有匹配函数调用 sub_one::sub_one()

没有匹配函数调用 sub_one::sub_one()

没有匹配的函数调用 sub_two::sub_two()

没有匹配的函数调用 sub_two::sub_two()

我就是不知道出了什么问题。

0 投票
2 回答
1359 浏览

c++ - 委托复制构造函数和常量数据初始化

我有一个A有很多数据成员的类,其中一些是不变的。所有数据成员都有适当的复制构造函数,所以我想默认我的类的复制构造函数:

然后,我想编写一个构造函数,它接受一个引用A和一个应该初始化常量数据成员之一的值:

这里op应该被复制,并且a应该在a_之后初始化或者代替复制。我想通过委托给复制构造函数来避免手动初始化所​​有数据成员,但是在这种情况下如何覆盖我的 const 数据成员?例如:

显然,所有这些方法都是邪恶的,因为它们尝试初始化a两次。

另一种解决方案是将所有常量数据移动到基类并编写所有需要的ctor,但它看起来很冗长。

有没有更清洁的实施方式A(const A&, int a_)

0 投票
2 回答
857 浏览

c++ - 使用类字段作为参数时,委托构造函数会导致分段错误

实际上,分段错误发生在我尝试编译的另一个程序中,这是由于这种行为而发生的。

我的问题是:

这是一个错误还是我的错?

可以以任何方式重现(即使该something字段是私有的或受保护的),这是我的示例:

主.cc:

以下是编译时发生的情况:

并运行:

输出是:

-O0但是当我使用or -O1or ...启用优化时-O2,输出只是一个新行:

G++ 版本:

0 投票
1 回答
449 浏览

c++ - 在成员初始化列表和构造函数主体中委托构造函数有什么区别

C++11 中的构造函数允许我们进行构造函数链接。例如,我们可以这样编码:

我已经尝试在成员初始化列表和代码主体中委托 Foo() 。在这两种情况下,我都会收到相同的返回值。我的问题是这两种方法是否真的有任何区别?如果它们相同,那么应用一个比另一个有什么优势吗?

0 投票
3 回答
855 浏览

c++ - C ++:使用委托构造函数时选择`const char *`与`std :: string`

考虑以下:

因此,常数string被视为const char *一个。

但是,如果我们将std::string构造函数设为“主要”,会发生什么变化?

我们可以期望std::string创建一个对象并将其传递给相应的构造函数而不调用与 C 字符串相关的构造函数吗?

同样,首先调用了 C 字符串构造函数。

这种行为是在 C++ 标准中描述的,还是与编译器相关的?

这对于例如模板或重载函数的工作方式是否相同?

我用 GCC 7.3.0 (MSYS2 x64) 编译。

0 投票
1 回答
1438 浏览

c++ - 错误:表达式不能用作函数

我是 lambdas 新手,我用自定义比较器函数制作了自己的二进制堆类。一切顺利,直到我遇到编译错误并且我不知道如何修复。

我试图改变我的代码行,而不是

我改成这样:

我得到了同样的结果。如何处理这个错误?

二叉堆类:

我的代码中有编译错误的部分

0 投票
1 回答
81 浏览

c++11 - 我可以在委托构造函数中使用“this”吗?

C++11 引入了将构造从一个构造函数委托给另一个构造函数的可能性—— “委托构造函数”

但是 - 这样做时,我们可以使用 this 指针吗?例如,作为我们委托的构造函数之一的参数?在“真正的构造函数”还没有真正被调用的时候假设我们可以做到这一点并不是微不足道的。