C ++在构造函数中通过引用传递

时间:2015-12-06 23:25:26

标签: c++ oop

所以我用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);

感谢您的任何提示或帮助!

1 个答案:

答案 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;