一个返回队列的函数?

时间:2014-05-04 15:45:53

标签: c++ queue

我试图弄清楚队列在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

任何帮助表示赞赏!谢谢!

1 个答案:

答案 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异常。