[英]Error no appropriate default constructor available
我正在用節點和迭代器實現一個列表類,該列表類創建一個票證類型的列表,這是我在一個類中定義的對象,但是當我嘗試編譯時,它說沒有明顯的列表默認構造函數是。 有人在這里看到這個問題嗎?
這是類的定義
class List : public Ticket
{
public:
List();
void tick_print(vector<Ticket*> halfticks, int i);
void push_back(Ticket* data);
void insert(Iterator iter, Ticket* s);
Iterator erase(Iterator iter);
Iterator begin();
Iterator end();
private:
Node* first;
Node* last;
friend class Iterator;
};
這是默認構造函數的實現
List::List()
{
first = NULL;
last = NULL;
}
這是我創建列表的地方
List ticks;
這是機票代碼
#include <iostream>
#include <string>
using namespace std;
class Season;
class Monthly;
class Daily;
class Half;
class Ticket
{
public:
Ticket(int m, int d, int y, int h);
virtual void display();
virtual bool isvalid(int cm, int cd, int cy, int ch);
virtual int getyear();
virtual int getmonth();
virtual int getday();
virtual int gethour();
protected:
int month;
int day;
int year;
int hour;
int hour2;
};
class Season: public Ticket
{
public:
Season(string t, int m, int d, int y, int h);
void display();
bool isvalid(int cm, int cd, int cy, int ch);
protected:
string type;
};
class Monthly: public Ticket
{
public:
Monthly(string t, int m, int d, int y, int h);
void display();
bool isvalid(int cm, int cd, int cy, int ch);
protected:
string type;
};
class Daily: public Ticket
{
public:
Daily(string t, int m, int d, int y, int h);
void display();
bool isvalid(int cm, int cd, int cy, int ch);
protected:
string type;
};
class Half: public Ticket
{
public:
Half(string t, int m, int d, int y, int h);
void display();
bool isvalid(int cm, int cd, int cy, int ch);
int getyear();
int getmonth();
int getday();
int gethour();
protected:
string type;
};
Ticket::Ticket(int m, int d, int y, int h)
{
month = m;
day = d;
year = y;
hour = h;
hour2 = h+4;
}
void Ticket::display()
{
}
bool Ticket::isvalid(int cm, int cd, int cy, int ch)
{
return 0;
}
int Ticket::getyear()
{
return year;
}
int Ticket::getmonth()
{
return month;
}
int Ticket::getday()
{
return day;
}
int Ticket::gethour()
{
return hour;
}
Season::Season(string t, int m, int d, int y, int h)
:Ticket(m, d, y, h)
{
type = t;
}
void Season::display()
{
cout << type + " Ticket - ";
cout << year;
}
bool Season::isvalid(int cm, int cd, int cy, int ch)
{
if(year == cy)
return true;
else
return false;
}
Monthly::Monthly(string t, int m, int d, int y, int h)
:Ticket(m, d, y, h)
{
type = t;
}
void Monthly::display()
{
cout << type + " Ticket - ";
cout << month << "/" << year;
}
bool Monthly::isvalid(int cm, int cd, int cy, int ch)
{
if(year == cy && month == cm)
return true;
else
return false;
}
Daily::Daily(string t, int m, int d, int y, int h)
:Ticket(m, d, y, h)
{
type = t;
}
void Daily::display()
{
cout << type + " Ticket - ";
cout << month << "/" << day << "/" << year;
}
bool Daily::isvalid(int cm, int cd, int cy, int ch)
{
if(year == cy && month == cm && day == cd)
return true;
else
return false;
}
Half::Half(string t, int m, int d, int y, int h)
:Ticket(m, d, y, h)
{
type = t;
}
void Half::display()
{
cout << type + " Ticket - ";
cout << month << "/" << day << "/" << year << " from " << hour << " to " << hour2;
}
bool Half::isvalid(int cm, int cd, int cy, int ch)
{
if(year == cy && month == cm && day == cd)
{
if(ch >= 9 && ch <= 13)
{
if(ch >= hour && ch <= hour2)
return true;
else
return false;
}
else
return false;
}
else
return false;
}
int Half::getyear()
{
return year;
}
int Half::getmonth()
{
return month;
}
int Half::getday()
{
return day;
}
int Half::gethour()
{
return hour;
}
Ticket
沒有默認的構造函數,因此List
不能默認構造,因為它繼承了Ticket
,並且List
不會在Ticket
調用基本構造函數。
如果在派生類的構造函數的初始化列表中不包含用於初始化基類的代碼,則使用默認構造函數來初始化基類。 換一種說法,
List::List()
{
}
等效於:
List::List() : Ticket()
{
}
由於Ticket
沒有默認的構造函數,因此編譯器無法通過已發布的代碼初始化Ticket
。
您可以通過以下方法之一解決此問題:
Ticket
添加默認構造函數 更新List::List()
以使用初始化列表中Ticket
的唯一構造函數。
List::List() : Ticket(0, 0, 0) // You need to figure out what values // make sense in your application. { }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.