gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:34:41 27 4
gpt4 key购买 nike

所以我正在用 C++ 编写一个程序,我的主要方法必须构造一个对象,该对象将一个 vector 作为参数。

这是我的代码:

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();
}

所以,我认为这些是一些非常简单的面向对象的概念。

我的目标是:

首先,初始化一个空的卖家 vector 。卖方是具有构造函数的对象:

Seller(int i);

当然,也代表卖家。

然后,我想用实际的卖家填充 vector 。这些是在 for 循环中构造的。

然后,我想创建一个商店,将在那里工作的卖家作为参数。

最后,我创建了一个名为 books 的新双端队列,并在 Store 类中为其分配了 books 的值。 Books 双端队列的初始化是在 Store 的构造函数中完成的:

Store::Store(vector<Seller> &sellers) {
this->sellers = sellers;
this->books = deque<Book> (100, "Harry Potter");
}

所以这是代码,我想知道我是否在将参数传递给新构造函数部分时犯了错误。

我在通过引用传递时有点困惑,所以我想寻求这方面的帮助。我有两个主要问题:

1) 考虑到我想如何运行我的程序,是否有任何错误?还要考虑在 main 方法的其余部分(此处未包含)我不断更改 books deque 的值。2) 有什么方法可以在不删除和插入的情况下替换双端队列中的元素?

是否有内置函数替换?如果不是,如果我只想替换双端队列中的值,下面的代码是否可以工作?

例如,如果双端队列是这样的:

3 4 5 2

它(一个迭代器)的值为 2。

然后我希望双端队列变成:

3 4 6 2

做的时候:

books.erase(it);
books.insert(it, 6);

感谢任何提示或帮助!

最佳答案

OK,下面是一个简短的分析。

首先,我发现的唯一真实错误:staff被定义为一个指针并被赋予一个值 new但从未被释放。无论如何你应该避免使用原始指针,所以要么在堆栈上创建对象:

vector<Seller> staff{};

或者使用智能指针

auto staff = make_unique<vector<Seller>>{};

(然后您将必须学习一些有关所有权语义的知识,因此您仍然是初学者,我建议您使用第一种解决方案)。

然后,注意这条线

this->sellers = sellers;

Store::Store将制作 sellers拷贝 vector ,这可能不是你的意思。如果您希望您的商店引用在 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;

关于C++ 在构造函数中通过引用传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34124132/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com