C ++创建没有默认构造函数的对象数组

时间:2017-08-14 18:15:12

标签: c++ arrays pointers object constructor

动态创建(事务)对象的数组时出错。错误输出说:“没有匹配函数来调用'Transaction :: Transaction()' 这是赋值的一部分,我们不允许使用默认构造函数。从我收集的数据中,一个数组在创建时自动为每个索引地址分配值,并且没有为Transaction创建默认构造函数,如果没有值,它就无法执行此操作。请帮我看看我能做些什么来解决这个错误。

class Transaction
{
private:
  int id;
  float amount;
  string fromAddress, toAddress, signature;
  bool confirmed, removeFromPool;
  static int numTransactions;


public:
  Transaction(string in_fA, string in_tA,string in_sign,float in_amount);
  Transaction(Transaction &obj);
  int getId() const;
}
//---------------------

class Block
{
private:
  int id, txCount;
  const int MAX_TX=5;
  Transaction** txList;
  string blockHash, prevBlockHash, minerName;
  bool confirmed;

public:
  Block(int id,string prevH,string name);
  }
//------------------
// block.cpp
Block::Block(int i, string prevH, string name)
{
*txList = new Transaction[MAX_TX];
}

3 个答案:

答案 0 :(得分:1)

如果您坚持使用普通动态数组,可以执行此操作:

*txList = new Transaction[MAX_TX]{{"1", "2", "3", 4},
                                  // 3 more
                                  {"5", "6", "7", 8}};

但你可以将你的构造函数声明为:

Transaction(string in_fA = "a", string in_tA = "b", string in_sign = "c", float in_amount = 42);

因此试图躲避愚蠢的“无默认ctor”要求。

答案 1 :(得分:0)

使用std::vector是解决此问题最简单(也是最好)的方法:

class Block {
public:
  Block()
    : txList(MAX_TX, Transaction("a", "b", "C", 0.0f)) {}

private:
  std::vector<Transaction> txList;
};

答案 2 :(得分:0)

如果这是你的“赋值”,并且你不允许使用默认构造函数,我假设你应该使用其中一个:

  • malloc
  • std::vector在引擎盖下使用malloc

第一个选项中,内存分配如下所示:

Transaction* transactionsList = (Transaction*) malloc(size * sizeof(Transaction));

修改:不要忘记在malloc后使用free delete来释放内存。< / p>

我必须注意,通常不建议使用malloc来支持C ++中的newnew的要点是将两个阶段合并在一起:内存分配和内存初始化(+指针类型对话为您完成)。但是,您需要的是分配一块内存,您可以考虑使用malloc。无论如何,take a look at this

Jarod42 Frank 指出的第二个选项:

std::vector<Transaction> transactionsList(size, *default_value*);

并获得size个元素的向量,每个元素都被初始化为您指定的默认值。

如果允许您定义移动Transaction(Transaction&& obj) = default;或复制构造函数Transaction(const Transaction& obj) { ... },您还可以保留内存:

std::vector<Transaction> transactionsList;
transactionsList.reserve(size);

然后使用emplace_back()push_back()添加新元素。