簡體   English   中英

從成員函數調用構造函數

[英]calling constructor from member function

這是問題:

定義一個名為Month的類,該類是一個月的抽象數據類型。 您的班級將有一個類型為int的成員變量來表示一個月(1表示1月,2表示2月,依此類推)。 包括以下所有成員函數:構造函數,使用月份名稱中的前三個字母作為三個參數設置月份;構造函數,使用整數作為參數設置月份(1表示1月,2表示2月,依此類推),默認構造函數,將月份作為整數讀取的輸入函數,將月份作為月份名稱中的前三個字母讀取的輸入函數,將月份作為整數輸出的輸出函數,輸出函數,輸出月作為月名稱中的前三個字母,成員函數返回下個月作為月類型的值。 將類定義嵌入測試程序中。

#include <iostream>
using namespace std;

class Month
{
public:
    Month (char letter1, char letter2, char letter3);
    Month (int numOfMonth);
    Month ();
    void inputAsNum(); // read month as integer
    void inputAsCh(); //  read first three chars of month
    void outputAsCh() const;
    void outputAsNum() const;
    Month nextMonth();
private:
    int month;
};

int main()
{
    Month test(5);
    //test.inputAsNum();
    cout << "Current month is " << endl;
    test.outputAsCh();
    test.outputAsNum();
    cout << endl;
    test.nextMonth();
    cout << "Next month is " <<endl;
    test.outputAsCh();
    test.outputAsNum();
    cout << endl;

    Month test2('a','p','r');
    //test2.inputAsCh();
    cout << "Current month is " << endl;
    test2.outputAsCh();
    test2.outputAsNum();
    cout << endl;
    test2.nextMonth();
    cout << "Next month is " <<endl;
    test2.outputAsCh();
    test2.outputAsNum();
    cout << endl;


    Month test3;
    test3.inputAsNum();
    cout << "Current month is " << endl;
    test3.outputAsCh();
    test3.outputAsNum();
    cout << endl;
    test3.nextMonth();
    cout << "Next month is " <<endl;
    test3.outputAsCh();
    test3.outputAsNum();
    cout << endl;

    Month test4;
    test4.inputAsCh();
    cout << "Current month is " << endl;
    test4.outputAsCh();
    test4.outputAsNum();
    cout << endl;
    test4.nextMonth();
    cout << "Next month is " <<endl;
    test4.outputAsCh();
    test4.outputAsNum();
    cout << endl;

    return 0;
}

Month::Month (char letter1, char letter2, char letter3)
{
    if ((letter1 == 'j')&&(letter2 == 'a')&&(letter3 == 'n'))
        month= 1;
    else if ((letter1 == 'f')&&(letter2 == 'e')&&(letter3 == 'b'))
        month= 2;
    else if ((letter1 == 'm')&&(letter2 == 'a')&&(letter3 == 'r'))
        month= 3;
    else if ((letter1 = 'a')&&(letter2 == 'p')&&(letter3 == 'r'))
        month= 4;
    else if ((letter1 == 'm')&&(letter2 == 'a')&&(letter3 == 'y'))
        month= 5;
    else if ((letter1 == 'j')&&(letter2 == 'u')&&(letter3 == 'n'))
        month= 6;
    else if ((letter1 == 'j')&&(letter2 == 'u')&&(letter3 == 'l'))
        month= 7;
    else if ((letter1 == 'a')&&(letter2 == 'u')&&(letter3 == 'g'))
        month= 8;
    else if ((letter1 == 's')&&(letter2 == 'e')&&(letter3 == 'p'))
        month= 9;
    else if ((letter1 == 'o')&&(letter2 == 'c')&&(letter3 == 't'))
        month= 10;
    else if ((letter1 == 'n')&&(letter2 == 'o')&&(letter3 == 'v'))
        month= 11;
    else if ((letter1 == 'd')&&(letter2 == 'e')&&(letter3 == 'c'))
        month= 12;
}
Month::Month (int numOfMonth)
                    :month(numOfMonth)
{ }
Month::Month ()
                    :month(1)
{ }
void Month::inputAsNum()
{
    int num;
    cout << "Enter num of month => ";
    cin  >> num;
    month = num;
}
void Month::inputAsCh()
{
    char c1,c2,c3;
    cout << "Enter three letters of month => ";
    cin  >> c1 >> c2 >> c3;
    Month::Month(c1,c2,c3);
}
void Month::outputAsCh() const
{
    if (month == 1)
        cout << "Jan ";
    else if (month == 2)
        cout << "Feb ";
    else if (month == 3)
        cout << "Mar ";
    else if (month == 4)
        cout << "Apr ";
    else if (month == 5)
        cout << "May ";
    else if (month == 6)
        cout << "Jun ";
    else if (month == 7)
        cout << "Jul ";
    else if (month == 8)
        cout << "Aug ";
    else if (month == 9)
        cout << "Sep ";
    else if (month == 10)
        cout << "Oct ";
    else if (month == 11)
        cout << "Nov ";
    else if (month == 12)
        cout << "Dec ";
}
void Month::outputAsNum() const
{
    cout << month;
}
Month Month::nextMonth()
{
    if (month < 12)
        month++;
    else if (month == 12)
        month = 1;
    return Month(month);
}

代碼運行正常。 我嘗試從成員函數void Month::inputAsCh()調用構造函數Month::Month (char letter1, char letter2, char letter3) void Month::inputAsCh() 我可以通過更改Month::inputAsCh()定義並將復制構造函數的粘貼定義復制到函數中來解決該問題。 但是,出於好奇,可以從成員函數中調用構造函數嗎? 如果沒問題,那么Month::inputAsCh()出錯,我也嘗試使用Month test4變量。

Output                                  Expected Output
-------------                           -----------------
Current month is                        Current month is 
Nov 11                                  Nov 11
Next month is                           Next month is 
Dec 12                                  Dec 12
Current month is                        Current month is 
Apr 4                                   Apr 4
Next month is                           Next month is 
May 5                                   May 5
Enter num of month => 2                 Enter num of month => 2
Current month is                        Current month is 
Feb 2                                   Feb 2
Next month is                           Next month is 
Mar 3                                   Mar 3
Enter three letters of month => apr     Enter three letters of month => apr
Current month is                        Current month is 
Jan 1                                   Apr 4
Next month is                           Next month is 
Feb 2                                   May 5
Month::Month(c1,c2,c3);

該行不會更新當前對象。 這應該是錯誤的,因為Month::Month在該上下文中命名了構造函數,但是某些編譯器(尤其是clang )會將其解釋為臨時對象的構造(這要感謝user657267進行更正)。

您可以將月份計算代碼分解為一個單獨的函數,然后從構造函數和inputAsCh函數中調用該函數:

void setMonth(char letter1, char letter2, char letter3)
{
    if ((letter1 == 'j')&&(letter2 == 'a')&&(letter3 == 'n'))
        month= 1;
    else if ((letter1 == 'f')&&(letter2 == 'e')&&(letter3 == 'b'))
        month= 2;
    else if ((letter1 == 'm')&&(letter2 == 'a')&&(letter3 == 'r'))
        month= 3;
    else if ((letter1 = 'a')&&(letter2 == 'p')&&(letter3 == 'r'))
        month= 4;
    else if ((letter1 == 'm')&&(letter2 == 'a')&&(letter3 == 'y'))
        month= 5;
    else if ((letter1 == 'j')&&(letter2 == 'u')&&(letter3 == 'n'))
        month= 6;
    else if ((letter1 == 'j')&&(letter2 == 'u')&&(letter3 == 'l'))
        month= 7;
    else if ((letter1 == 'a')&&(letter2 == 'u')&&(letter3 == 'g'))
        month= 8;
    else if ((letter1 == 's')&&(letter2 == 'e')&&(letter3 == 'p'))
        month= 9;
    else if ((letter1 == 'o')&&(letter2 == 'c')&&(letter3 == 't'))
        month= 10;
    else if ((letter1 == 'n')&&(letter2 == 'o')&&(letter3 == 'v'))
        month= 11;
    else if ((letter1 == 'd')&&(letter2 == 'e')&&(letter3 == 'c'))
        month= 12;
}

Month::Month (char letter1, char letter2, char letter3)
{
    setMonth(letter1, letter2, letter3);
}

void Month::inputAsCh()
{
    char c1,c2,c3;
    cout << "Enter three letters of month => ";
    cin  >> c1 >> c2 >> c3;
    setMonth(c1,c2,c3);
}

順便說一句,可以通過從這些char創建一個std::string並將其與之比較來大大簡化setMonth函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM