2014-09-19 111 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