我试图弄清楚队列在C ++中是如何工作的,并且在处理对象时遇到困难。我似乎只能得到一个返回地址而不是对象的名称(这是我真正想要的)。当我尝试从队列中弹出元素时,它也显示错误。我的代码如下:
Buyer.h档案
#ifndef BUYER_H
#define BUYER_H
#include <string>
#include <queue>
#include "Order.h"
#include "Entity.h"
#include "Seller.h"
class Order;
class Seller;
class Buyer : public Entity {
public:
Buyer(const std::string &, const std::string &, double);
virtual ~Buyer() { }; // when step is added make this virtual
void addSeller(Seller *);
std::queue<Seller*> getSellers() const;
void addOrder(Order *);
std::queue<Order*> getOrders() const;
virtual void list() const override;
virtual void step() const override;
private:
std::queue<Order*> orders;
std::queue<Seller*> sellers;
};
#endif
Buyer.cpp文件
#include <iostream>
#include <ostream>
#include <stdexcept>
#include <string>
#include <queue>
#include "Buyer.h"
#include "Seller.h"
#include "Order.h"
#include "Entity.h"
using namespace std;
Buyer::Buyer(const std::string &name, const std::string &id, double balance)
: Entity(name, id, balance)
{
// initialize seller and order queue??
} // Constructor
void Buyer::addSeller(Seller *s) {
sellers.push(s);
} // addSeller
std::queue<Seller*> Buyer::getSellers() const {
while(!sellers.empty()) {
return sellers;
} // while
} // getSellers
void Buyer::addOrder(Order *o) {
orders.push(o);
} // addOrder
std::queue<Order*> Buyer::getOrders() const {
while(!orders.empty()) {
return orders;
} // while
} // getOrders
void Buyer::list() const {
Entity::list();
std::cout << "Orders:\nOrder contains:";
std::cout << "\nSellers:\n";
int i = 0;
while(!sellers.empty()) {
std::cout << sellers.front() << "\n";
sellers.pop();
} // while
} //list
void Buyer::step() const {
std::cout << "\nstep enter\n"
<< "step exit\n\n";
} // step
任何帮助表示赞赏!谢谢!
答案 0 :(得分:1)
(这不是一个完整的答案,但它太大了,不能发表评论)
可以返回std::queue<Order *>
,等等。但是,您需要清楚拥有指向的对象;即谁负责删除它们。
返回std::queue<Order *>
时,返回的队列是原始队列的副本,但所有指针都指向原始指针所指向的同一对象。 (这是一种&#34;浅拷贝&#34;)。
如果然后delete
返回队列中的任何内容,您将导致原始队列出现故障,因为它将访问已删除的内存。
因此,这是一个脆弱的设计,因为尽管getOrders
是一个const函数,调用者很容易导致该对象搞砸。
一个&#34;解决方案&#34;是使容器包含shared_ptr<Order>
而不是Order *
。一切都自动发生;来电者可以添加或删除他心中的内容。
如果容器不一定要包含指针,请考虑使用对象容器:std::queue<Order>
。这种方法的好处是默认的复制和移动语义都是正确的。
另一种需要考虑的方法是让getOrders()
和getSellers()
返回一个const引用,而不是返回队列的副本。
NB。在Buyer::getSellers()
和getOrders()
中,如果它为空,那么在没有return
的情况下,您将脱离函数的末尾,从而导致未定义的行为。您需要返回一些内容(返回空队列有什么问题?)或throw
异常。