双链接列表中未处理的异常 我尝试用C++实现一个限量指令书(非常简单的一个),它有一个:ST::MAP,其中键是价格点,值是代码> PrICPosith对象。

双链接列表中未处理的异常 我尝试用C++实现一个限量指令书(非常简单的一个),它有一个:ST::MAP,其中键是价格点,值是代码> PrICPosith对象。,c++,exception,C++,Exception,Book类有两个,分别是bid和ask来存储购买和销售 在调试器中,我看到下一个指针最终会变成垃圾,这表明我没有正确初始化,是吗 此外,程序在异常之前输出垃圾数据(也表示未初始化的指针) 非常感谢您的帮助。这些: void insertAfter(Order *node, Order new_node) void insertHead(Order new_node) void insertTail(Order new_node) 插入指向局部变量的指针。他们必须拿一个指针: void inse

Book
类有两个,分别是
bid
ask
来存储购买和销售

在调试器中,我看到
下一个
指针最终会变成垃圾,这表明我没有正确初始化,是吗

此外,程序在异常之前输出垃圾数据(也表示未初始化的指针)

非常感谢您的帮助。

这些:

void insertAfter(Order *node, Order new_node)
void insertHead(Order new_node)
void insertTail(Order new_node)
插入指向局部变量的指针。他们必须拿一个指针:

void insertAfter(Order *node, Order* new_node)
void insertHead(Order* new_node)
void insertTail(Order* new_node)
试试这个(我想,纠正一下):

#包括
#包括
#包括
使用名称空间std;
#定义最大数量订单512
阶级秩序
{
公众:
无符号整数id;
无符号整数价格;
无符号整数卷;
布尔侧;
增加了时间;
执行时间;
时间没有取消;
命令*下一步;
订单*prev;
订单(无符号整数价格、无符号整数体积、布尔端)
{
该->id=0;
这个->价格=价格;
这个->体积=体积;
这个->侧面=侧面;
本->新增=0;
此->已执行=0;
此->取消=0;
本->下一步=0;
此->上一个=0;
}
};
类价格点
{
公众:
订单*头;
顺序*尾部;
价格点(无效)
{
这个->头=0;
这->尾=0;
}
void insertAfter(订单*节点,订单*新节点)
{
新建节点->下一步=节点->下一步;
如果(节点->下一步==0)
{
此->尾=新的_节点;
}
其他的
{
节点->下一步->上一步=新建节点;
}
节点->下一步=新建节点;
}
无效插入头(订单*新节点)
{
如果(此->头==0)
{
此->头=新节点;
此->尾=新的_节点;
新建_节点->上一个=0;
新建_节点->下一步=0;
}
其他的
{
insertAfter(此->尾部,新的_节点);
}
}
void insertTail(订单*新节点)
{
如果(此->尾部==0)
{
插入头(新节点);
}
其他的
{
insertAfter(此->尾部,新的_节点);
}
}
无符号整数计数(void)
{
无符号整数i;
订单节点(0,0,false);
while(node.next==0)
{
对于(i=0;ihead==0)
{
返回true;
}
其他的
{
返回false;
}
}
作废打印(作废)
{
如果(此->空()==true)
{
coutbid[order.price].insertTail(&order);//在双链接列表的尾部插入
}
}
else if(order.side==true)//卖出订单
{
如果(此->投标计数(订单价格)==0)
{
PricePoint pp;
配对新的_pp(订单价格,pp);
ask.insert(new_pp);//添加价格点(即在地图中添加条目)
}
{
this->ask[order.price].insertTail(&order);//在双链接列表的尾部插入
}
}
return order.id;//订单的id
}
整数取消(未签名整数id)
{
}
作废打印(作废)
{
无符号整数i=0;

如果您的函数将
顺序
作为一个值,然后执行类似
this->tail=&new_node;
的操作,这会导致
tail
在函数返回时指向不再存在的某个位置。将其作为引用传递。这是许多代码的方式,请将其缩小到仅相关的位。如何找出哪一位部分是相关的?在调试器中运行程序,它将在异常位置停止,这意味着你知道问题在哪里,并且应该能够找出相关的部分。为什么不使用<代码> STD::列表< /代码>:<代码> >包含< /C++ >,但是你不使用它。链表类,那么你为什么要尝试重新发明轮子呢?你已经在使用
std::map
,那么你为什么不使用
std::list
??
void insertAfter(Order *node, Order new_node)
void insertHead(Order new_node)
void insertTail(Order new_node)
void insertAfter(Order *node, Order* new_node)
void insertHead(Order* new_node)
void insertTail(Order* new_node)
#include <iostream>
#include <map>
#include <list>
using namespace std;

#define MAX_NUM_ORDERS 512

class Order
{
  public:
  unsigned int id;
  unsigned int price;
  unsigned int volume;
  bool side;
  time_t added;
  time_t executed;
  time_t cancelled;

  Order *next;
  Order *prev;

  Order(unsigned int price, unsigned int volume, bool side)
  {
    this->id = 0;
    this->price = price;
    this->volume = volume;
    this->side = side;
    this->added = 0;
    this->executed = 0;
    this->cancelled = 0;
    this->next = 0;
    this->prev = 0;
  }
};

class PricePoint
{
  public:
    Order *head;
    Order *tail;

    PricePoint(void)
    {
      this->head = 0;
      this->tail = 0;
    }

    void insertAfter(Order *node, Order* new_node)
    {
      new_node->next = node->next;

      if(node->next == 0)
      {
        this->tail = new_node;
      }
      else
      {
        node->next->prev = new_node;
      }

      node->next = new_node;
    }

    void insertHead(Order* new_node)
    {
      if(this->head == 0)
      {
        this->head = new_node;
        this->tail = new_node;
        new_node->prev = 0;
        new_node->next = 0;
      }
      else
      {
        insertAfter(this->tail, new_node);
      }
    }

    void insertTail(Order* new_node)
    {
      if (this->tail == 0)
      {
        insertHead(new_node);
      }
      else
      {
        insertAfter(this->tail, new_node);
      }
    }

    unsigned int count(void)
    {
      unsigned int i;
      Order node(0, 0, false);

      while(node.next == 0)
      {
        for(i=0;i<=MAX_NUM_ORDERS;i++)
        {
          // lol
        }
      }

      return i;
    }

    bool empty(void)
    {
      if(this->head == 0)
      {
        return true;
      }
      else
      {
        return false;
      }
    }

    void print(void)
    {
      if(this->empty() == true)
      {
        cout<<"[None]"<<endl;
        return;
      }
      else
      {
        if(this->head != 0)
        {
          unsigned int i;
          Order *node = this->head; // start at the head

          cout<<"id, volume, added"<<endl; // labels

          while(node->next != 0) // while we're not at the end
          {
            cout<<node->id<<", "<<node->volume<<", "<<node->added<<endl;
            node = node->next;
          }
        }
        else // try and catch it again i guess?
        {
          cout<<"[None]"<<endl;
          return;
        }
      }
    }
};

class Book
{
public:
  map<int, PricePoint> bid; // buy-side
  map<int, PricePoint> ask; // sell-side

  int add(Order order)
  {
    order.id = this->bid.size() + this->ask.size() + 1; // this way, buy-side and sell-side orders have unique identifiers

    if(order.side == false) // buy order
    {
      if(this->bid.count(order.price) == 0) // if the price point isn't already there
      {
        PricePoint pp;
        pair<int, PricePoint> new_pp(order.price, pp);
        bid.insert(new_pp); // add the price point (i.e. add an entry to the map)
      }
      else
      {
        this->bid[order.price].insertTail(&order); // insert at tail of the doubly linked list
      }
    }
    else if(order.side == true) // sell order
    {
      if(this->bid.count(order.price) == 0)
      {
        PricePoint pp;
        pair<int, PricePoint> new_pp(order.price, pp);
        ask.insert(new_pp); // add the price point (i.e. add an entry to the map)
      }
      {
        this->ask[order.price].insertTail(&order); // insert at the tail of the doubly linked list
      }
    }

    return order.id; // the order's id
  }

  int cancel(unsigned int id)
  {

  }

  void print(void)
  {
    unsigned int i = 0;

    cout<<"-------------------------------------BIDS--------------------------------------"<<endl;
    cout<<this->bid.size()<<endl;

    for(i=0;i<this->bid.size();i++)
    {
      cout<<"Orders for $"<<i<<":"<<endl;
      this->bid[i].print();
    }
    i = 0;
    cout<<endl;

    cout<<"-------------------------------------ASKS--------------------------------------"<< ask.size() <<endl;

    for(i=0;i<this->ask.size();i++)
    {
      cout<<"Orders for $"<<i<<":"<<endl;
      this->ask[i].print();
    }
    cout<<endl;
  }
};

int main(void)
{
  unsigned int i;
  Book orderbook; // our limit order book

  // some orders
  Order a(4, 33, false);
  Order b(4, 12, true);
  Order c(5, 33, true);

  //add them
  orderbook.add(a);
  orderbook.add(b);
  orderbook.add(c);

  cout<<"Order book is as follows:"<<endl;

  orderbook.print();

//  system("pause");

  return 0;
 }