建设班级和范围

时间:2014-09-19 19:40:52

标签: c++ class constructor scope

所以我有一个关于创建类对象和范围的问题。我的程序需要做3种不同的事情,具体取决于它是否被./Bank,./ Bank [number]和./ Bank [number] [string]调用。我有一个Bank类,它有3个与程序启动方式相对应的构造函数Bank(),Bank(int num)和Bank(int num,string str)。 “Bank”只是一个Customer对象数组,默认构造函数设置数组的默认长度,第二个构造函数允许用户设置数组的长度,最后一个允许用户设置长度和文本文件名填充数组(它使用info创建一个新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语句中创建一个类时它是不同的吗?

1 个答案:

答案 0 :(得分:0)

问题:

每个Bank都是在if bloc的范围内创建的。一旦退出块,变量gest就会被破坏。同样对于arrgc> 2,您创建Bank两次。

解决方案

在使用其他和正确的顺序重新组织您的if之前。

然后,如果你坚持拥有这些不同的构造函数,那么第一个替代方法是在bank的范围内声明main(),它将使用默认构造函数。在你的ifs中,你会创建一个临时的Bank并做一个分配:

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

这样可行,但它并不优雅,因为您首先创建一个将被覆盖的未使用的空银行。

第二个atlernative,将使用main()范围内的指针:这允许您使用不同的构造函数,并只构造一个Bank:

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 */); 

但是,诚恳地,你应该重新考虑你的设计,因为:

  • 银行往往拥有越来越多的客户,因此从您的数字或客户开始,并在以后增加,应该在您的设计中预见到。
  • 在构造中用文件填充银行会引发不必要的问题:如果找不到文件会怎样(你的构造函数的构造失败了!)?如果客户的数量超过银行预计会怎样?
  • 使用该文件的构造函数的代码将与其他构造函数的代码部分冗余。

我会建议像:

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   
...
}