我想初始化一个结构类型的数组。目前我正在做这个
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_n
或 generate_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); });
}
};