2014-09-25 60 views
0

下午好!是否可以在C++中使用Mutator內的Mutator?

我做了一些快速搜索,我很難找出我應該如何去做我需要做的事情。

對於這個程序,我們正在創建一個基本的工作票類。每個屬性都有其自己的增變器和存取器,但是另外還有一個增量器,它將所有的屬性作爲參數並一次性設置它們。

我不能僅僅使用構造函數來放置值的主要原因是因爲對於這個增變器,我們必須對值進行一些驗證。對於單個屬性增變器,其中兩個已經在其增變器中進行了驗證。另外兩個只有在調用setWorkTicket mutator時才需要驗證。

有沒有辦法從增變器中調用增變器?或者確保驗證這兩個屬性的唯一方法是將他們的驗證從他們的修改器複製並粘貼到setWorkTicket中?

如果您需要澄清,或者我要求的內容不清楚,請告訴我。我附上了有關課程。

/** Lab2.cpp 
* @desc  SOME DESCRIPTION 
* @author  Aaron, Aaron 
* @since  24 September 2014 
**/ 


#include <iostream> 
#include <iomanip> 
#include <string> 
#include "MyInputValidation.h" 
#include <sstream> 
#include <stdexcept> 

using namespace std; 

class WorkTicket 
{ 
    public: 
     /*** PARAMETERIZED CONSTRUCTOR ***/ 
     WorkTicket(): myWorkTicketNumber(0), myClientID(""), myDay(1), myMonth(1), myYear(2000), myIssue("") {} 

     WorkTicket(int workTicketNumber, string clientID, int day, int month, int year, string issue); 

     /*** ACCESSORS ***/ 
     int getWorkTicketNumber() const { return myWorkTicketNumber; } 

     string getClientID() const { return myClientID; } 

     string getDate(int myDay, int myMonth, int myYear) const; 

     string getIssue() const { return myIssue; } 

     void showWorkTicket() const; 

     /*** MUTATORS ***/ 
     void setWorkTicketNumber(int workTicketNumber); 

     void setClientID(string clientID) { myClientID = clientID; } 

     void setDate(int day, int month, int year); 

     void setIssue(string issue) { myIssue = issue; } 

     bool setWorkTicket(int workTicketNumber, string clientID, int day, int month, int year, string issue); 


    private: 
     int myWorkTicketNumber; 
     string myClientID; 
     int myDay; 
     int myMonth; 
     int myYear; 
     string myIssue; 

}; 

/*** MAIN ***/ 
int main() 
{ 
     // Output an information header 
    cout << "=============================" << endl 
     << "=== WorkTicket Class Demo ===" << endl 
     << "=============================" << endl; 

    try 
    { 
     // DECLARATIONS 
     WorkTicket ticketOne(1, "Aaron", 24, 9, 2014, "Printer not accessible from networked computers."); 

     ticketOne.showWorkTicket(); 

    } 
    catch(const exception& ex) 
    { 
     cerr << ex.what(); // display the exception message. 
    } 


    // done. 
    cout << endl << endl; 
    return 0; 
} 

/*** PARAMETERIZED CONSTRUCTOR ***/ 
WorkTicket::WorkTicket(int workTicketNumber, string clientID, int day, int month, int year, string issue) 
{ 
    setWorkTicketNumber(workTicketNumber); 
    setClientID(clientID); 
    setDate(day, month, year); 
    setIssue(issue); 
} 

/*** ACCESSORS ***/ 
string WorkTicket::getDate(int myDay, int myMonth, int myYear) const 
{ 
    stringstream dateReturn; 

    dateReturn << myDay << "-" << myMonth << "-" << myYear; 

    return dateReturn.str(); 
} 

void WorkTicket::showWorkTicket() const 
{ 
     cout << setw(20) << "\nWork Ticket Number: " << myWorkTicketNumber << endl 
      << setw(20) << left << "Client ID: " << myClientID << endl 
      << setw(20) << left << "Ticket Date: " << myDay << "-" << myMonth << "-" << myYear << endl 
      << setw(20) << left << "Issue: " << myIssue << endl; 
} 

/*** MUTATORS ***/ 
void WorkTicket::setWorkTicketNumber(int workTicketNumber) 
{ 
    // Local declarations 
    const int MIN_TICKET_NUMBER = 1; // Ace 

    if(workTicketNumber < MIN_TICKET_NUMBER) 
    { 
     // declare a stringstream object 
     stringstream strOut; 
     // build a descriptive error string. 
     strOut << "\nTicket Number argument: " << workTicketNumber << " is out of range. " << endl 
       << "Ticket Number must be greater than or equal to " << MIN_TICKET_NUMBER << ". "; 

     // throw an out_of_range exception initialized with 
     // the error string 
     throw invalid_argument(strOut.str()); 
    } 
    else // otherwise, the rank parameter is fine 
    { 
     // assign the parameter to the member variable 
     myWorkTicketNumber = workTicketNumber; 
    } 
} 

void WorkTicket::setDate(int day, int month, int year) 
{ 
    const int MIN_DAY_MONTH = 1; 
    const int MAX_DAY = 31; 
    const int MAX_MONTH = 12; 
    const int MIN_YEAR = 2000; 
    const int MAX_YEAR = 2099; 

    stringstream strOut; 

    if(day < MIN_DAY_MONTH || day > MAX_DAY) 
    { 
     // build a descriptive error string. 
     strOut << "\nDate argument: " << day << " is out of range. " << endl 
       << "Day must be greater than or equal to " << MIN_DAY_MONTH 
       << " and less than or equal to " << MAX_DAY << ". "; 

     // throw an out_of_range exception initialized with 
     // the error string 
     throw invalid_argument(strOut.str()); 
    } 
    else if(month < MIN_DAY_MONTH || month > MAX_MONTH) 
    { 
     // build a descriptive error string. 
     strOut << "\nDate argument: " << month << " is out of range. " << endl 
       << "Month must be greater than or equal to " << MIN_DAY_MONTH 
       << " and less than or equal to " << MAX_MONTH << ". "; 

     // throw an out_of_range exception initialized with 
     // the error string 
     throw invalid_argument(strOut.str()); 
    } 
    else if(year < MIN_YEAR || year > MAX_YEAR) 
    { 
     // declare a stringstream object 
     stringstream strOut; 
     // build a descriptive error string. 
     strOut << "\nDate argument: " << year << " is out of range. " << endl 
       << "Year must be greater than or equal to " << MIN_YEAR 
       << " and less than or equal to " << MAX_YEAR << ". "; 

     // throw an out_of_range exception initialized with 
     // the error string 
     throw invalid_argument(strOut.str()); 
    } 
    else // otherwise, the rank parameter is fine 
    { 
     // assign the parameter to the member variable 
     myDay = day; 
     myMonth = month; 
     myYear = year; 
    } 
} 

bool WorkTicket::setWorkTicket(int workTicketNumber, string clientID, int day, int month, int year, string issue) 
{ 


    return true; 
} 
+0

什麼是增變器?也可以通過const引用傳遞字符串。如果它們返回一個類成員而不是本地構造的字符串,你可以通過const引用返回它們。 – 2014-09-25 16:26:47

+0

@Neil Mutator/Accessor與Setter/Getter相同。 – 2014-09-25 16:34:54

回答

2

出了什麼問題只是在做:

bool WorkTicket::setWorkTicket(int workTicketNumber, string clientID, int day, int month, int year, string issue) 
{ 
    setWorkTicketNumber(workTicketNumber); 
    setDate(day, month, year); 
    setClientID(clientID); 
    setIssue(issue); 

    return true; 
} 

您可以讓異常傳播或趕上他們在setWorkTicket(),並根據您的需要返回false

+0

對不起......我以爲我試過這樣做,並得到一個錯誤。我想我已經做了其他的事情,並得到了錯誤?無論如何謝謝你! – 2014-09-25 16:33:54

+0

通過const引用傳遞字符串。 – 2014-09-25 16:41:41