当前位置: 首页 > 知识库问答 >
问题:

使用非平凡构造函数初始化对象d::a序列

施锋
2023-03-14

我有一个类定义

class Edgelet
{
private:
    const int e_size;
    //Other private members...
public:
    //The constructor
    explicit Edgelet (int size, Color cl1 = Color::NA, Color cl2 = Color::NA);
    //Other public members...

由于类中有一个const成员,编译器会隐式删除默认的复制构造函数。需要给它一个参数进行初始化。

问题出现在课堂上

class Cube
{
private:
    std::array <Edgelet, 12> c_edgelets;
    //Other members...
public:
    //The constructor
    Cube(int size)
    
    //Other public members...

这个类包含前面类对象的std::array。如何初始化这个数组?大小参数需要给std::array的每个元素来初始化。我想将std::array的每个元素设置为Edglet(size-2)

当然,我可以使用初始值设定项列表,但由于构造函数有12个元素和其他参数,代码变得越来越难看。此外,我用6个元素而不是12个元素的类似案例进行了验证。

我也试过给参数默认值,但是因为有const成员,所以以后不能更改值。我也试过d::initializer_list但是似乎你不能向它添加新元素(或者也许你可以??)。有没有有效的方法来做到这一点?

共有2个答案

黄兴业
2023-03-14

如果数组成员不是默认可构造的,则必须为每个元素提供initiailzer。您可以使用std::vector而不是std::array来代替此操作std::vector有一个构造函数,其形式为

constexpr vector( size_type count,
                  const T& value,
                  const Allocator& alloc = Allocator());
                  

这将构造用值初始化的对象。这会使您的代码看起来像

class Cube
{
private:
    std::vector<Edgelet> c_edgelets;
    //Other members...
public:
    //The constructor
    Cube(int size) : c_edgelets(12, Edgelet(size - 2)) {}
    
    //Other public members...
};

谭成业
2023-03-14

您可以编写助手类:

template <std::size_t ... Is, typename T>
std::array<T, sizeof...(Is)> make_array_impl(const T& def, std::index_sequence<Is...>)
{
    return {{(Is, void(), def)...}};
}

template <std::size_t N, typename T>
std::array<T, N> make_array(const T& def)
{
    return make_array_impl(def, std::make_index_sequence<N>());
}

然后

Cube(int size) : c_edgelets(make_array<12>(Edgelet(size - 2)) {}
 类似资料:
  • 映射对构造函数没有限制或要求 (__init__ )类的方法。您可以自由地为您想要的函数要求任何参数,为ORM未知的实例分配属性,并且通常在编写Python类的构造函数时做您通常会做的任何其他事情。 sqlAlchemy ORM不调用 __init__ 从数据库行重新创建对象时。ORM的过程有点类似于Python标准库的 pickle 模块,调用低级 __new__ 方法,然后在实例上悄悄地恢复属

  • 生成类对象时,其成员可以用类的构造函数初始化。构造函数是与类同名的成员函数。程序员提供的构造函数在每次生成类对象(实例化)时自动调用。构造函数可以重载.提供初始化类对象的不同方法。数据成员应在类的构造函数中初始化或在生成对象之后设置其数值。 常见编程错误 6.7 类的数据成员只能在类定义中初始化。 常见编程错误 6.8 试图声明构造函数的返回类型和返回植是个语法错误。 编程技巧 6.5 适当时候(

  • 如果我有以下结构 我初始化为 这应该值初始化对象并根据标准执行以下操作: 如果T是一个(可能是cv限定的)类类型,没有用户提供或删除的默认构造函数,则该对象为零初始化,并检查默认初始化的语义约束,如果T有一个非平凡的默认构造函数,则该对象为默认初始化的; 有一个非常重要的构造函数,可以通过以下方法进行检查: 该标准是否意味着我的对象在值初始化的情况下应该始终为零初始化,然后随后默认初始化? 如果我

  • 矩阵.java 使用矩阵.java 此程序在运行时显示NullPointerException错误 我想通过Default Constructors创建一个大小为3*3的2D Array。 然后,我想使用参数化构造函数创建一个大小为5*4的数组。

  • 问题内容: 我有两个班,第一个是我的主班,第二个是我的编辑框架班。 我的第二个类(UpdateGUI)在其构造函数中提供oldName,并对其进行编辑,当我单击时,它将newName发送给我的第一个类。 我的第二堂课: 我的问题是,为什么newName为null? 更新: UpdateGUIDialog类: 输出: 我需要打印而不是null。 问题答案: Java对象有点像真实对象。并顾名思义:它

  • 主要内容:初始化 const 成员变量构造函数的一项重要功能是对成员变量进行初始化,为了达到这个目的,可以在构造函数的函数体中对成员变量一一赋值,还可以采用 初始化列表。 C++构造函数的初始化列表使得代码更加简洁,请看下面的例子: 运行结果: 小明的年龄是15,成绩是92.5 李华的年龄是16,成绩是96 如本例所示,定义构造函数时并没有在函数体中对成员变量一一赋值,其函数体为空(当然也可以有其他语句),而是在函数首部与函数体之间添