C++ 在C+中是否可以在一个Mutator中使用一个Mutator+;?

C++ 在C+中是否可以在一个Mutator中使用一个Mutator+;?,c++,validation,setter,C++,Validation,Setter,下午好 我做了一些快速的搜索,我有一个艰难的时间试图找出我应该如何去做我需要做的事情 对于这个程序,我们正在创建一个基本工作票类。每个属性都有自己的mutator和accessor,但另外还有一个mutator,它将所有属性作为参数,并一次性设置它们 我不能只使用构造函数来放置值的主要原因是,对于这个mutator,我们必须对值执行一些验证。对于单个属性变量,其中两个已经在其变量中执行了验证。只有在调用setWorkTicket mutator时,才需要验证另外两个 有没有一种方法可以从变异子内

下午好

我做了一些快速的搜索,我有一个艰难的时间试图找出我应该如何去做我需要做的事情

对于这个程序,我们正在创建一个基本工作票类。每个属性都有自己的mutator和accessor,但另外还有一个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;
}
/**Lab2.cpp
*@desc一些描述
*@作者亚伦,亚伦
*@自2014年9月24日起
**/
#包括
#包括
#包括
#包括“MyInputValidation.h”
#包括
#包括
使用名称空间std;
班级工作票
{
公众:
/***参数化构造函数***/
工作票():myWorkTicketNumber(0),myClientID(“”),myDay(1),myMonth(1),myYear(2000),myIssue(“”{}
工作票(int工作票编号、字符串clientID、int日、int月、int年、字符串发行);
/***访问者***/
int getWorkTicketNumber()常量{返回myWorkTicketNumber;}
字符串getClientID()常量{return myClientID;}
字符串getDate(int myDay、int myMonth、int myYear)常量;
字符串getIssue()常量{return myIssue;}
作废showWorkTicket()常量;
/***突变子***/
作废setWorkTicketNumber(int workTicketNumber);
void setClientID(字符串clientID){myClientID=clientID;}
无效设置日期(整数天、整数月、整数年);
void setIssue(字符串问题){myIssue=issue;}
bool setWorkTicket(int-workTicketNumber,string-clientID,int-day,int-month,int-year,string-issue);
私人:
int myWorkTicketNumber;
字符串myClientID;
int myDay;
int myMonth;
国际年;
字符串问题;
};
/***主要***/
int main()
{
//输出一个信息头

cout这样做有什么不对:

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

什么是mutator?还可以通过常量引用传递字符串。如果它们返回类成员而不是本地构造的字符串,则可以通过常量引用返回它们。@Neil mutator/Accessor与Setter/Getter相同。对不起……我以为我尝试过这样做,但出现了错误。我s我做了别的事情,但弄错了?无论如何,谢谢!通过常量引用传递字符串。