c++ - 如何在 C++ 中为没有默认构造函数的结构初始化数组

标签 c++ arrays constructor

<分区>

我想初始化一个结构类型的数组。目前我正在做这个

struct Gene 
{
    int **boxes;
    int fitness;

    Gene()
    {
        boxes = new int*[get_the_number]; 
        for (int i = 0; i < get_the_number; ++i) {
            boxes[i] = new int[get_the_number];
        }
    }
};

我是这样初始化的

Gene * P = new Gene [t];

它工作正常,我可以做我的工作。它调用我自己编写的默认构造函数并完成工作。但是现在,我想将一个参数传递给默认构造函数。我将我的构造函数更改为此。

Gene(int n)

但是我不知道怎么初始化,我是这样做的

Gene * P= new Gene (2) [t];

但它给我的错误是“不存在从 Gene* 到 Gene 的合适转换”。我知道我可以编写 setter 函数并在那里做我想做的事情,或者不是制作一个 Gene 类型的数组,我可以制作一个 Gene* 数组,并且在每个索引处我可以初始化 new Gene(2)。但我不想这样做,因为我不需要传递变量。我只是想知道我不能调用带有参数的构造函数。

我不能做类似 Gene * P= new Gene(2)[t]; 的事情吗?

我的意思是编译器正在调用不带参数的构造函数。它不能调用这个构造函数而不是那个吗? 谢谢,

p.s.:我知道这是一个初学者问题,但很长一段时间后我又回到了 C++,所以我不会安静地记住事情。

最佳答案

首先,我赞成使用 std::vector 而不是自己调用 new[]delete[] 的建议。你会省去很多麻烦。

其次,我可以想办法做你想做的事。我无法想象如果每个对象都是用不同的参数创建的(类似于 Lisp 的 map),你会期望什么样的语法,所以我假设你希望每个对象是使用相同的参数或使用易于计算的参数创建。

std::vector 具有所有相同的对象:

#include <vector>

std::vector<Gene> P(size, Gene(2));

std::vector 具有相似但不相同的对象:

#include <algorithm>
#include <iterator>
#include <vector>

int foo = 0;
std::vector<Gene> P;
// you can omit the next line; back_inserter will make sure the vector grows appropriately
P.reserve(size); 
std::generate_n(std::back_inserter(P), size, [&foo](){ Gene(++foo); });

您可以在创建 Gene 对象的 lambda 中获得更多乐趣,或者您可以使用普通函数而不是 lambda。

new[] 具有相同的对象:

#include <algorithm>
#include <iterator>

Gene* P = new Gene[size];
std::fill_n(P, size, Gene(2));

具有相似对象的新[]:

#include <algorithm>
#include <iterator>

int foo = 0;
Gene* P = new Gene[size];
std::generate_n(P, size, [&foo]() { Gene(++foo); });

new[] 的两种情况都会创建默认对象,这些对象会立即被 fill_ngenerate_n 覆盖(在一个不错的实现中,vector 方法应该不会有这个问题)。这可能没什么可担心的,但我觉得有义务提及它。更大的问题是用普通的 new[]delete[] 编写异常安全代码几乎是不可能的。使用 vector 编写异常安全代码要容易得多。

而且,是的,出于同样的原因,我建议对 Gene 进行相同类型的更改(截至目前,Gene 根本不是异常安全的;这是糟糕的是 new[] 通过抛出异常报告失败):

#include <algorithm>
#include <iterator>
#include <vector>

struct Gene {
    std::vector<std::vector<int>> boxes;
    int fitness;
    static const size_t DEFAULT_NUMBER_OF_BOXES = 20;

    Gene() : boxes(DEFAULT_NUMBER_OF_BOXES), fitness(0)
    {
        std::for_each(boxes.begin(), boxes.end(),
                      [](std::vector<int>& b) { b.resize(DEFAULT_NUMBER_OF_BOXES); });
    }

    Gene(size_t N) : boxes(N), fitness(0)
    {
        std::for_each(boxes.begin(), boxes.end(),
                      [N](std::vector<int>& b) { b.resize(N); });
    }
};

关于c++ - 如何在 C++ 中为没有默认构造函数的结构初始化数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23227794/

相关文章:

c++ - 使用哪个编辑器?用于编码 c/c++

c++ - 任何人都可以向我解释这些陈述背后的逻辑是什么

c - 将多维数组与通用函数一起使用

c - 释放 C 中的 2D 数组。 "double free or corruption"和 "invalid next size"

javascript - 使用 Angular 数组显示键和值

Java 内部类 : extends keyword for multiple

c++ - 依赖于模板参数的成员变量和构造函数

C++ 点作为空格?

c++ - 生成径向梯度的算法

C++ 忽略构造函数异常的后果