所以我用C ++编写程序,我的main方法必须构造一个对象作为参数作为向量。
这是我的代码:
int main() {
vector<Seller> *staff = new vector<Seller>;
for (int i = 0; i < 50; i++) {
staff->push_back(Seller(i));
}
BookStore store(*staff);
deque<Book> books;
books = store.getBooks();
}
所以,我认为这些是一些非常简单的面向对象的概念。
我的目标是:
首先,初始化卖家的空载体。卖方是一个具有构造函数的对象:
Seller(int i);
当然代表卖家。
然后,我想用实际的卖家填写矢量。这些是在for循环中构建的。
然后,我想创建一个商店,作为在那里工作的卖家的参数。
最后,我创建了一个名为books的新deque,并为其分配了Store类中书籍的价值。 Books deque的初始化是在Store的构造函数中完成的:
Store::Store(vector<Seller> &sellers) {
this->sellers = sellers;
this->books = deque<Book> (100, "Harry Potter");
}
所以这是代码,我想知道我是否在向新构造函数部分传递参数时犯了错误。
通过引用传递时我有点困惑,所以我要求帮助一点。我有两个主要问题:
1)那里有没有错误,考虑到我想运行我的程序?还要考虑在主要方法的其余部分(此处未包括)中,我不断更改书籍双端队列的值。 2)有没有办法替换双端队列中的元素而不必擦除和插入?
是否有内置功能替换?如果没有,如果我只想替换deque中的值,下面的代码是否会起作用?
例如,如果双端队列是这样的:
3 4 5 2
它(迭代器)的值为2。
然后我想要deque成为:
3 4 6 2
做的时候:
books.erase(it);
books.insert(it, 6);
感谢您的任何提示或帮助!
答案 0 :(得分:0)
好的,这是一个简短的分析。
首先,我发现的唯一真实错误:staff
被定义为指针,并且被赋予一个new
的值,但从未被释放。无论如何你应该避免使用原始指针,所以要么在堆栈上创建对象:
vector<Seller> staff{};
或使用智能指针
auto staff = make_unique<vector<Seller>>{};
(然后你必须学习一些关于所有权语义的东西,所以你仍然是初学者我推荐第一个解决方案。)
然后,请注意该行
this->sellers = sellers;
Store::Store
中的会使sellers
向量的副本,这可能不是您的意思。如果您希望商店引用main()
上创建的变量,则应将Store
重新定义为
class Store {
// ...
vector<Seller>& sellers;
//...
};
,构造函数为
Store::Store(vector<Seller> &sellers) :
sellers{sellers} // reference member variables must be given a value before the body of the constructor begins
{
books = deque<Book> (100, "Harry Potter");
}
出于同样的原因,你的行
books = store.getBooks();
将制作deque
的副本(但在这种情况下可能是有意的)。
最后,C ++在<algorithms>
库下提供了许多容器操作函数。看看the reference。但是如果你已经有了要替换的元素的迭代器,那么你不需要这样的算法,只需写:
*it = 6;