所以我有一个关于创建类对象和范围的问题。我的程序需要做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语句中创建一个类时它是不同的吗?
答案 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
...
}