2014-09-19 4 views
0

Итак, у меня возник вопрос о создании объекта класса и области видимости. Моя программа должна делать 3 разных вещи в зависимости от того, вызвана ли она ./Bank, ./Bank [число] и ./ Bank [число] [строка]. У меня есть класс Bank, у которого есть 3 менеджера, которые соответствуют запуску программы Bank(), Bank (int num) и Bank (int num, string str). «Банк» - это всего лишь массив объектов Customer, конструктор по умолчанию задает длину массива по умолчанию, второй конструктор позволяет пользователю задать длину массива, а последний позволяет пользователю задать длину и имя текстового файла для заполнения массива (он использует информацию для создания нового Клиента, а затем добавляет Заказчика в массив). Могу ли я сделать это в основном?конструкция класса & scope

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.функция()? Или банк существует только в области if if? Я знаю, что с переменной она не будет существовать вне оператора if, но разве это не так, если вы создаете класс внутри оператора if?

+0

Возможный дубликат: [Расширение сферы действия переменной инициализируется в/если еще последовательности] (http://stackoverflow.com/questions/24638158/ expand-scope-of-a-variable-initialized-in-a-if-else-sequence) –

ответ

0

Проблема:

Каждый ваш Bank создан в рамках Условный блока. Как только вы выходите из блока, переменная gest уничтожается. Также для arrgc> 2 вы создаете два раза Bank.

Решения

Раньше ничего reorganisze ваши if сек, используя еще и правильный порядок.

Тогда первая альтернатива, если вы настаиваете на использовании этих разных конструкторов, заключается в объявлении bank в объеме main(), который будет использовать конструктор по умолчанию. В вашем МФСЕ, вы можете создать временный Bank и сделать: присваивания

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

В ответ на раздел «пересмотреть ваш дизайн» это лаборатория из школы. Это только 3-я лаборатория, поэтому все по-прежнему довольно элементарно, поэтому мы начинаем с определенного количества клиентов, и нам не нужно беспокоиться о том, что файлы не найдены. Помимо этого спасибо! –

Смежные вопросы