如何在c ++中正确初始化Struct对象

时间:2014-05-11 22:10:26

标签: c++ struct queue

因此,我正在制作一个程序,该文件以以下格式从文件中读取信息:

20 6
22 7
15 9

程序将这些作为一个事件读取,其中第一个数字是时间,第二个数字是长度,并且必须在EventList结构中向队列添加事件。目前我在EventList :: fill函数中遇到一个编译错误,说我对Event :: Event有未定义的引用。

我的问题是如何在EventList :: fill函数中正确定义一个新事件,这样我最终可以将这些事件推送到EventList中定义的优先级队列中?我对Event的构造函数的设置方式以及如何正确初始化它的变量以使程序可以读取文件的每一行并使用正确的值生成事件感到困惑。

这是我到目前为止所做的:

#include <fstream>
#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <queue>

using namespace std;

struct Event {
enum EventKind {Arrival, Departure};
EventKind type;
int time, length;

Event (EventKind theType=Arrival, int theTime=0, int theLength=0);
};

istream& operator>>(istream& is, Event& e);

typedef priority_queue<Event> EventPQType; 

struct EventList {
    EventPQType eventListPQ;
    void fill(istream& is);
};

int main(int argc, char** argv)
{
   EventList eventList;

   char* progname = argv[0];  
   ifstream ifs(argv[1]);
   if (!ifs) {
       cerr << progname << ": couldn't open " << argv[1] << endl;
       return 1;
   }
   eventList.fill(ifs);
}

void EventList::fill(istream& is) {
Event e;

while(is >> e){
    cout << e.time << e.length; 
}

cout << "EventList::fill was called\n";
 }

istream& operator>>(istream &is, Event &e) {
is >> e.time >> e.length;
return is;
}

2 个答案:

答案 0 :(得分:0)

您需要为构造函数提供定义。

答案 1 :(得分:0)

如其他答案中所述,您需要提供构造函数:

struct Event {
  enum EventKind {Arrival, Departure};
  EventKind type;
  int time, length;

  Event(EventKind theType=Arrival, int theTime=0, int theLength=0);
};

Event::Event(EventKind theType, int theTime, int theLength):
  type(theType),
  time(theTime),
  length(theLength)
{}

也可以在结构声明中内联定义:

struct Event {
  enum EventKind {Arrival, Departure};
  EventKind type;
  int time, length;

  Event(EventKind theType=Arrival, int theTime=0, int theLength=0):
    type(theType),
    time(theTime),
    length(theLength)
  {}
};

事实上,在C ++中,可以考虑像默认情况下成员是公共的类的结构。因此,定义构造函数的方法对于结构和类是相同的。