2013-10-18 50 views
1

所以我仍然在處理這個問題,並認爲我有它正確。但是,現在它只顯示「ABC行業」和「報告」,而不是僅在沒有輸入信息時才這樣做。我在哪裏搞亂我的代碼?C++構造函數並獲取它以顯示默認答案

//This program displays a company's name and report. 
#include <iostream> 
#include <string> 
#include <Windows.h> 
using namespace std; 

class Heading { 
private: 
    string company; 
    string report; 

public: 
    Heading() { 
     company = "ABC Industries"; 
     report = "Report"; 
    } 


    Heading(string c, string r) { 
     company = c; 
     report = r; 
    } 


    void storeInfo(string company, string report); 

    string getCompany() { 
     return company; 
    } 
    string getReport() { 
     return report; 
    } 
}; 


void Heading::storeInfo(string c, string r) { 
    c = company; 
    r = report; 
} 

void storeInfo(Heading&); 
void showInfo(HANDLE, Heading); 
void placeCursor(HANDLE, Heading); 

int main() { 
    Heading company; 
    HANDLE screen = GetStdHandle(STD_OUTPUT_HANDLE); 
    storeInfo(company); 
    showInfo(screen, company); 
    cin.ignore(); 
    cin.get(); 
    return 0; 
} 

/*****storeInfo*****/ 
void storeInfo(Heading &item) { 
    string company; 
    string report; 
    cout << "\nPlease enter the company name.\n"; 
    getline(cin, company); 
    cout << "\nPlease enter the report name.\n"; 
    \ 
    getline(cin, report); 
    item.storeInfo(company, report); 
} 

/*****placeCursor*****/ 
void placeCursor(HANDLE screen, int row, int col) { 
    COORD position; 
    position.Y = row; 
    position.X = col; 
    SetConsoleCursorPosition(screen, position); 
} 

/*****showInfo*****/ 
void showInfo(HANDLE screen, Heading item) { 
    system("cls"); 
    placeCursor(screen, 6, 25); 
    cout << "********************************" << endl; 
    placeCursor(screen, 8, 32); 
    cout << item.getCompany() << endl; 
    placeCursor(screen, 11, 36); 
    cout << item.getReport(); 
    placeCursor(screen, 13, 25); 
    cout << "********************************" << endl; 
} 
+1

構造函數_construct_。使用一種方法來顯示東西 – sehe

+0

你在main上聲明瞭Heading類,可能會導致這種情況。如果你聲明一個Heading類型的變量而不指定你剛纔聲明的變量應該調用哪個構造函數,那麼編譯器會調用默認的構造函數,在這種情況下恰好是分配company =「ABC Industries」和report =「Report」。 – Juniar

回答

2

更新

這裏有一個版本,顯示瞭如何有默認值顯示出來,當你希望他們:

看到它Live On Coliru

class Heading { 
private: 
    string company; 
    string report; 

    static string defaultCompany() { return "ABC Industries"; } 
    static string defaultReport() { return "Report"; } 

public: 
    Heading(string const& c = defaultCompany(), string const& r = defaultReport()) 
     : company(c), report(r) { } 

    void storeInfo(string const& c, string const& r) 
    { 
     company = c; 
     report = r; 
    } 

    string getCompany() const { return company.empty()? defaultCompany() : company; } 
    string getReport() const { return report.empty()? defaultReport() : report; } 
}; 

,你可以看,你需要檢查收到的輸入是否爲空,因爲你我總是無條件地設置storeInfo中的成員。

全部程序:

#include <iostream> 
#include <string> 

using namespace std; 

namespace // windows_cruft 
{ 
    using HANDLE = unsigned; 
    HANDLE STD_OUTPUT_HANDLE = 1; 
    HANDLE GetStdHandle(HANDLE) {return 42;} 

    struct COORD { int X,Y; }; 
    void SetConsoleCursorPosition(HANDLE, COORD){} 
} 

class Heading { 
private: 
    string company; 
    string report; 

    static string defaultCompany() { return "ABC Industries"; } 
    static string defaultReport() { return "Report"; } 

public: 
    Heading(string const& c = defaultCompany(), string const& r = defaultReport()) 
     : company(c), report(r) { } 

    void storeInfo(string const& c, string const& r) 
    { 
     company = c; 
     report = r; 
    } 

    string getCompany() const { return company.empty()? defaultCompany() : company; } 
    string getReport() const { return report.empty()? defaultReport() : report; } 
}; 

void storeInfo(Heading&); 
void showInfo(HANDLE, Heading); 
void placeCursor(HANDLE, Heading); 

int main() { 
    Heading company; 
    HANDLE screen = GetStdHandle(STD_OUTPUT_HANDLE); 
    storeInfo(company); 
    showInfo(screen, company); 
    cin.ignore(); 
    cin.get(); 
    return 0; 
} 

/*****storeInfo*****/ 
void storeInfo(Heading &item) { 
    string company; 
    string report; 
    cout << "\nPlease enter the company name.\n"; 
    getline(cin, company); 
    cout << "\nPlease enter the report name.\n"; 
    getline(cin, report); 
    item.storeInfo(company, report); 
} 

/*****placeCursor*****/ 
void placeCursor(HANDLE screen, int row, int col) { 
    COORD position; 
    position.Y = row; 
    position.X = col; 
    SetConsoleCursorPosition(screen, position); 
} 

/*****showInfo*****/ 
void showInfo(HANDLE screen, Heading item) { 
    //system("cls"); 
    placeCursor(screen, 6, 25); 
    cout << "********************************" << endl; 
    placeCursor(screen, 8, 32); 
    cout << item.getCompany() << endl; 
    placeCursor(screen, 11, 36); 
    cout << item.getReport() << endl; 
    placeCursor(screen, 13, 25); 
    cout << "********************************" << endl; 
} 
+0

@PaulGriffiths我已經實現了其餘部分並修復了某些樣式元素:http://coliru.stacked-crooked.com/a/9bb14873b94f88fd – sehe

2

你有你的任務後到前。這:

void Heading::storeInfo(string c, string r) { 
    c = company; 
    r = report; 
} 

應該是這樣的:

void Heading::storeInfo(string c, string r) { 
    company = c; 
    report = r; 
} 

由於sehe提到,定義它:

void Heading::storeInfo(const string& c, const string& r) 

,編譯器可以幫助您避免這樣的事情。

+0

啊,我忽略了實現。這比我懷疑的bug更有趣。另一個默認通過'const&'傳遞的理由(除了在這種情況下,參數可能是'&&'而非我離題) – sehe

+0

是的,好處在'const'上。 –

+0

嘗試了你的建議 - 它確實允許顯示輸入的信息,但是,現在如果沒有輸入任何內容,它就不會顯示「ABC Industries」和「Report」的默認信息 – Moxy