Конструктор по умолчанию для наследования C++ в выпуске производного класса
У меня есть некоторые проблемы с наследованием. Я включил два разных класса, с которыми я работаю (WorkTicket
& ExtendedWorkTicket
). ExtendedWorkTicket
следует использовать переменные-члены WorkTicket
Вот почему я использовал их как защищенные.
Моя проблема возникает, когда я пытаюсь создать конструктор по умолчанию для ExtendedWorkTicket
, Я получаю сообщение об ошибке ExtendedWorkTicket
не имеет имен полей [...] (все, кроме myIsOpen
).
Я знаю, что могу заменить все эти переменные-члены WorkTicket(1, "", 1, 1, 2014, "")
в конструкторе, но это меняет функциональность, как если бы он вызывал конструктор Parameterized из WorkTicket
и пытается проверить их с помощью установщиков, чего не следует делать.
Мне нужно просто создать бланк WorkTicket
(с дополнительным myIsOpen
член), как то, что WorkTicket
конструктор по умолчанию делает.
class WorkTicket
{
public:
/***************************************************************************
* Default and parameterized constructor(s).
* If parameters are not specified, set the work ticket number to zero,
* the work ticket date to 1/1/2000, and all other attributes to empty
* strings.
***************************************************************************/
WorkTicket() : myTicketNumber(0), myClientId(""), myDate(1, 1, 2014), myDescription ("") { }
WorkTicket(int ticketNumber, string clientId, int day, int month, int year, string description);
/***************************************************************************
* Copy constructor
* Initializes a new WorkTicket object based on an existing WorkTicket
* object.
***************************************************************************/
WorkTicket(const WorkTicket& original);
/***************************************************************************
* SetWorkTicket()
* a mutator method to set all the attributes of the object to the
* parameters as long as the parameters are valid. ALL of the parameters
* must be valid in order for ANY of the attributes to change. Validation
* rules are explained for work ticket number and date. Client number
* and Description must be at least one character long. If no problems are
* detected, return TRUE. Otherwise return FALSE.
***************************************************************************/
bool SetWorkTicket(int ticketNumber, string clientId, int day, int month, int year, string description);
/***************************************************************************
* ShowWorkTicket( )
* An accessor method to display all the object's attributes neatly in
* the console window.
***************************************************************************/
virtual void ShowWorkTicket() const; // accessor
/***************************************************************************
* Attribute Sets/Gets.
* Include a set (mutator) and get (accessor) method for each attribute.
***************************************************************************/
// Ticket Number
void SetTicketNumber(int ticketNumber);
int GetTicketNumber() const {return myTicketNumber;}
// Client ID
void SetClientId(string clientId) {myClientId = clientId;}
string GetClientId() const { return myClientId;}
// Decsription
void SetDescription(string description) { myDescription = description; }
string GetDescription() const { return myDescription; }
// Date
void SetDate(int day, int month, int year);
const MyDate& GetDate() const { return myDate; }
/***************************************************************************
* Operators (LAB 3).
* Include a set (mutator) and get (accessor) method for each attribute.
***************************************************************************/
WorkTicket& operator=(const WorkTicket& original); // Assignment
operator string () const; // (string)
bool operator==(const WorkTicket& original); // Equality
friend ostream& operator<<(ostream& out, const WorkTicket& ticket); // Output
friend istream& operator>>(istream& in, WorkTicket& ticket); // Input
protected:
/***************************************************************************
* Private Attributes. An object of class WorkTicket has the following
* private attributes.
***************************************************************************/
int myTicketNumber; // Work Ticket Number - A whole, positive number.
string myClientId; // Client ID - The alpha-numeric code assigned to the client.
MyDate myDate; // Work Ticket Date - the date the workticket was created
string myDescription; // Issue Description - A description of the issue the client is having.
}; // end of WorkTicket class
И наследующий дочерний класс:
/***************************************************************************
* LAB 4 Inheritance Class - ExtendedWorkTicket
*
***************************************************************************/
class ExtendedWorkTicket : public WorkTicket
{
public:
ExtendedWorkTicket() : myTicketNumber(0), myClientId(""), myDate(1, 1, 2014), "", myIsOpen(true) { }
ExtendedWorkTicket(int ticketNumber, string clientID, int day, int month, int year, string description, bool isOpen) : WorkTicket(ticketNumber, clientID, day, month, year, description) {};
bool GetIsOpen() const { return myIsOpen; }
bool SetWorkTicket(int ticketNumber, string clientId, int day, int month, int year, string description, bool isOpen = true);
void ShowWorkTicket() const override;
void CloseTicket() { myIsOpen = !myIsOpen; }
friend ostream& operator<<(ostream& out, const ExtendedWorkTicket& ticket); // Output
private:
bool myIsOpen;
}; // end of ExtendedWorkTicket
1 ответ
ExtendedWorkTicket::ExtendedWorkTicket() :
#if defined(OPTIONAL)
WorkTicket(),
#endif
#if defined(ERRONEOUS)
myTicketNumber(0), myClientId(""), myDate(1, 1, 2014),
"", // incidentally, this literal is just bad syntax, it's not assigned to anything
#endif
myIsOpen(true) { }
Удалить инициализации членов базового класса; они обрабатываются конструктором базового класса. Вам не нужно явно вызывать базовый конструктор, но вы можете, если считаете, что это понятнее.