【问题标题】:constructing class & scope构造类和范围
【发布时间】:2014-11-14 11:35:26
【问题描述】:

所以我有一个关于创建类对象和范围的问题。我的程序需要做 3 件不同的事情,具体取决于它是否由 ./Bank、./Bank [number] 和 ./Bank [number] [string] 调用。我有一个 Bank 类,它有 3 个构造函数,对应于程序的启动方式 Bank()、Bank(int num) 和 Bank(int num, string str)。 “银行”只是一个客户对象数组,默认构造函数设置数组的默认长度,第二个构造函数让用户设置数组的长度,最后一个让用户设置长度和文本文件名填充数组(它使用信息创建一个新客户,然后将客户添加到数组中)。我可以主要这样做吗?

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 语句中创建一个类时它会有所不同吗?

【问题讨论】:

标签: c++ class constructor scope


【解决方案1】:

问题:

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

解决方案

在任何事情之前,使用 else 和正确的顺序重新组织您的 ifs。

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

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

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

第二种选择,将使用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 */); 

但老实说,您应该重新考虑您的设计,因为:

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

我会建议这样的想法:

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

【讨论】:

  • 响应“重新考虑你的设计”部分,这是学校的实验室。这只是第三个实验室,所以事情仍然相当基本,这就是为什么我们从一定数量的客户开始,我们不需要担心找不到文件。除此之外,谢谢!
猜你喜欢
  • 2018-12-14
  • 2014-03-24
  • 1970-01-01
  • 1970-01-01
  • 2011-11-20
  • 1970-01-01
  • 2013-05-06
  • 2012-09-14
  • 1970-01-01
相关资源
最近更新 更多