问题标签 [object-construction]
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.
c++ - 在调用基类构造函数之前初始化派生类成员变量。这是UB吗?
我想初始化一个派生类的成员变量,然后将它传递给基类构造函数。我想出了下面的解决方案(也在这里:http ://cpp.sh/4uu4q )
1)以下代码是否具有已定义或未定义的行为(UB)?
2)我试图做的是否表明设计不好?
raku - 如何从哈希构造 Perl6 中的对象?
在 Perl5 中,您可以执行以下操作:
由于自定义BUILDARGS
方法,底部的两个调用的工作方式相同,这基本上将它们都变成了 Moo(se)? 所期望的那种哈希引用。
但是我怎样才能在 Perl6 中做同样的事情呢?
那么如何获取在别处创建的散列,并将其转换为类的默认构造函数所需的命名参数类型呢?
type-conversion - 在 Perl6 类属性中键入强制
像 Perl5 中的大多数东西一样,有很多方法可以创建一个支持自定义类型强制的类的属性。这是一个简单的,从数组引用到哈希:
我一直在尝试将这样的东西移植到 Perl6,似乎我需要的是一种将一个强制Array
转换为SetHash
. 到目前为止,我能够做到这一点的唯一方法是这样的:
但在我看来,这似乎不是正确的方法,至少对于将奇数列表传递给构造函数会使脚本死亡的微小细节。
那么,这是如何在 Perl6 中完成的呢?为类属性实现自定义类型强制的推荐方法是什么(因为我确定不止一种)?
c++ - 为什么编译器在某些情况下只能将 char * 隐式转换为 std::string
这些工作:
但这不会:
如果“hello”在前两种情况下被隐式转换为std::string
,为什么不能在最后一种情况下呢?请注意,我没有将WithString
构造函数指定为explicit
,所以我期望这样的转换。
我可以通过这样做使行为起作用:
我只是对这个奇怪的东西感到好奇。如果我假设一个猜测,我会说这是因为在前两个工作情况下,转换是在const char *
to之间std::string
,但在错误情况下,这将需要一个 2 转换链,首先是 from const char *
to std::string
,然后是 from std::string
to WithString
。所以也许这就是原因,但我不确定。
c++ - C++:使用 Memmove 和 Malloc 复制对象
当我惊讶于下面的代码没有按预期工作时,我正在玩模板:
上面的代码应该创建一个传递给它的参数数量不同的对象。但是,当我创建一个以 std::string 为模板的实例时,传递“Hello”参数应该会给我一个指向包含“Hello”的字符串的指针。然而,这种情况并非如此。如果你运行上面的代码,pre 和 post 的值是不同的,pre 是正确的。有谁知道是什么导致了这种不良行为?谢谢。
java - 实例化后删除对象的变量
所以我有一个需要实例化某些变量的对象。这些变量通过对象数组传递给对象。然后,数组中的每个元素都被分配给一个内部变量。
在分配内部变量并且永远不会再次引用该数组之后,该数组是否会被垃圾收集,还是应该手动完成?
内存很重要,因为我需要创建几百个这样的对象以及其余的代码。
c++ - std::initializer_list 构造函数
在这样的代码中:
为什么它调用std::initializer_list<int>
构造函数的规范?如果我们定义例如构造函数,它将产生歧义编译错误std::initializer_list<double>
。这种构造的规则是什么,为什么std::initializer_list
用数字作为模板参数如此具体?
c++ - 表示一个不能被 ctor-initialization-list 初始化的值
我正在编写一个C
带有 type 成员foo
的类foo_t
。该成员必须在整个C
实例的整个运行时间内定义且有效;但是,我没有在编译时构建它的必要信息,即我不能使用
我也不能在调用 ctor 时构造它C
,即我不能
相反,我只能在C
ctor 中的一些代码运行后才能构建它。编辑:这样做的原因可能是我需要运行一些具有副作用的代码(例如磁盘或网络 I/O)来获取构造参数;而且我还需要运行该代码才能初始化其他成员,因此我不能将其作为初始化列表中的自由函数多次调用。
那么,我应该如何表示foo
?
- 如果
foo_t
可以用一些虚拟/无效/空/空值默认构造,那么我可以让它发生,并且知道它永远不会在那个虚拟状态下被访问是安全的。损害:foo
in的声明C
并不表明它总是有效的。 如果
foo_t
只有一个有效的状态,即在获得相关信息之前我根本无法构造它,那么:- 我可以使用
std::unique_ptr<foo_t>
;最初它将是nullptr
,然后被分配给。缺点:没有迹象表明它在结束后永远不会为空C()
;无用的分配。 - 我可以使用
std::optional<foo_t>
;最初它将是nullopt
,然后被分配给。缺点:没有迹象表明它在结束后永远不会是空的C()
;需要 C++14;“可选”一词表明拥有 是“可选的”foo
,而不是。
- 我可以使用
我对第二种情况更感兴趣,因为在第一种情况下,关于 afoo_t
有效性的歧义是一种内置的。有没有比我提到的两个更好的选择?
注意:我们无法更改foo_t
.
javascript - 如何在对象构造函数中以某人的 Discord 用户名命名对象?
我正在尝试在 Discord 的 JSON 文件中创建对象构造函数。大型构造函数被命名为“person”,我希望其中的对象是 Discord 消息作者的名字,但我不能将变量命名为“msg.author.username”。我应该怎么办?
gcc - 在容器上创建可变参数模板对象不起作用
下面是一个例子(不是整个班级,只是相关部分)
说我有以下
然后以下调用正常工作
但是以下会产生编译时错误
错误:
我不确定为什么模板不能使用这种模式,也不确定如何修复它,以便它可以按照我想要的方式工作,基于我看到的使用 std emplace 函数的示例,这应该能够工作。
编辑:基于没有初始化列表的版本可以正常工作的事实,我可以得出结论,问题是由于初始化列表。但是我不明白为什么这会是一个问题,这不应该能够基于调用 B 的 B 的构造函数构造适当的类型吗?