动态创建(事务)对象的数组时出错。错误输出说:“没有匹配函数来调用'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];
}
答案 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 ++中的new
。 new
的要点是将两个阶段合并在一起:内存分配和内存初始化(+指针类型对话为您完成)。但是,您需要的是分配一块内存,您可以考虑使用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()
添加新元素。