我不确定这是不是很好的编码练习,所以如果我错了请纠正我。
我需要一种动态创建Transaction类的方法,并将该对象添加到Transaction对象的向量中。这就是我所做的:
class Transaction {
int data;
Transaction(int d) : data(d) {}
};
class Container {
std::vector<Transaction> transactions;
void createTransaction();
};
void Container::createTransaction() {
int data;
std::cout << "Enter your data: ";
std::cin >> data;
Transaction t = new Transaction(data);
// In order to keep the object from destruction at end of function.
// Possibly could be done with static as well.
transactions.push_back(*t);
}
向量是对象的向量,而不是指针。这是一个我不需要删除动态内存的情况,因为它会在程序/范围结束时自行删除吗?
这是一种动态创建对象并存储它们的可怕方法吗?
答案 0 :(得分:4)
值语义适用:transactions.push_back(*t);
将推送t
中std::vector
的副本。
所以你仍然需要删除为原始对象分配的内存:通过调用new
必须匹配任何delete
。
您可能首先不需要new
,您可以这样做:
Transaction t(data);
...
transactions.push_back(t);
注意:强>
正如马特指出的,Transaction t = new Transaction(data);
甚至没有编译,你可能意味着Transaction* t = new Transaction(data);
答案 1 :(得分:0)
您可以将普通对象或指针存储到向量中的对象。当你在堆上创建对象然后在向量中描绘普通对象时,你在两者之间画线。
问题是谁会删除这些对象?
默认情况下,将普通对象存储在矢量中。但是,如果对象的复制很昂贵,或者没有正确的方法来定义对象的复制,或者你想保留多态行为,那么你将指针存储到容器中。