2014-09-19 46 views
0

所以我有一個關於創建類對象和範圍的問題。我的程序需要做3件不同的事情,具體取決於它是由./Bank,./Bank [number]還是./ Bank [number] [string]調用。我有一個Bank類,它有3個構造函數,它們對應於程序如何啓動Bank(),Bank(int num)和Bank(int num,string str)。 「Bank」只是一個Customer對象的數組,默認的構造函數設置數組的默認長度,第二個構造函數讓用戶設置數組的長度,最後讓用戶設置長度和文本文件名填充數組(它使用信息創建一個新的Customer,然後將Customer添加到數組中)。我能做到這一點嗎?構造類和範圍

int main(int argc, char **argv){ 
    string progName(argv[0]); 
    int numCustomers; 
    string fileName; 
    if(argc == 1){ 
     Bank bank; 
    } 
    //get number of customers argument 
    if(argc > 1){ 
     istringstream buf(argv[1]); 
     buf >> numCustomers; 
     Bank bank(numCustomers); 
    } 
    //get file name argument 
    if(argc > 2){ 
     istringstream buf(argv[1]); 
     buf >> numCustomers; 
     fileName = argv[2]; 
     Bank bank(numCustomers, fileName); 
    } // more stuff below 

然後在主要調用bank.function()?或者銀行是否只存在於if語句範圍內?我知道一個變量它不會存在於if語句之外,但是當你在if語句中創建一個類時它有什麼不同?

+0

的可能的複製:([展開一個的if/else順序初始化變量的作用域] http://stackoverflow.com/questions/24638158/擴大變量範圍初始化在一個如果其他序列) – 2014-09-19 19:51:49

回答

0

問題:

您的每一個Bank的是,如果一個集團的範圍內創建。一旦你退出該塊,變量gest就會被銷燬。對於arrgc> 2,您創建兩次Bank

的解決方案

任何使用之前其他reorganisze您if S和正確的順序。

然後,如果您堅持要使用這些不同的構造函數,則首先要在main()的範圍內聲明bank,該範圍將使用默認的構造函數。在您的IFS,你會創建一個臨時Bank,做一個assignement:

bank = Bank (...); // replaces bank with the newly constructed Bank 

這工作,但它不是高雅的,因爲你首先創建一個將被覆蓋未使用的空行。

二atlernative,將在main()範圍內使用指針:這使您可以使用不同的構造,建設只有一個銀行:

int main(...) { 
    ... 
    Bank* bankp = nullptr; 
    ... 
    if (argc==1) { 
     ... 
     bankp = new Bank; // create a pointer 
     } 
    ... 

進一步的改進是使用一個shared pointer

shared_ptr<Bank> bankp; 
    ... 
     bankp = make_shared<Bank> (/* parameters of the Bank construtor */); 

但honnestly,你應該重新考慮設計,因爲:

  • 銀行傾向於擁有越來越多的客戶,因此應該在您的設計中預見到,因此從數字或客戶開始並在以後增加。
  • 在施工中使用文件填充銀行引發了一些不必要的問題:如果找不到文件(您的構造函數未能完成構建,該怎麼辦?)?如果有更多的客戶比銀行預測的要多?
  • 您的構造函數與該文件的代碼將與其他構造函數的代碼部分冗餘。

我會建議somethink這樣的:

class Bank { 
... 
bool resize(size_t numCustomers); // resize bank without loosing data. Returns tue if ok 
bool read(string filename); // populates the bank, if necessary resizing it. True if ok 
... 
} 
+0

爲了迴應「重新考慮你的設計」部分,這是一個來自學校的實驗室。這只是第三個實驗室,所以事情還是比較基礎的,這就是爲什麼我們從一定數量的客戶開始,我們不需要擔心沒有找到文件。除此之外,謝謝你! – 2014-09-22 19:03:26