c ++错误:数组初始化程序必须是初始化程序列表

时间:2016-02-24 08:19:41

标签: c++ arrays

我真的一直在为一段代码苦苦挣扎几天。我运行代码时收到的错误消息是:      error: array initializer must be an initializer list accountStore (int size = 0) : accts(size) { }

这里似乎有其他类似问题,但不幸的是我无法应用他们的解决方案(要么不工作,要么不适用)。

我只是尝试做的是创建一个类'prepaidAccount'的容器类(数组,不能使用向量),但我无法让容器类'storeAccount'的构造函数部分工作。请参阅下面的代码段:

    class prepaidAccount{
public:
    //prepaidAccount ();
    prepaidAccount(string newPhoneNum, float newAvailBal) : phoneNumber(newPhoneNum), availableBalance (newAvailBal){} //constructor 

    double addBalance(double howMuch) {
        availableBalance = howMuch + availableBalance;
        return availableBalance;
    }
    double payForCall(int callDuration, double tariff) {
        callDuration = callDuration/60;     //convert to minutes
        double costOfCall = callDuration * tariff;
        if (costOfCall > availableBalance) {
            return -1;
        }
        else {
            availableBalance = availableBalance - costOfCall;
            return costOfCall;
        }
    }

    void setAvailBal(int newAvailBal) {availableBalance = newAvailBal;}
    float getAvailBal() {return availableBalance;}
    void setPhoneNum(string newPhoneNum) {phoneNumber = newPhoneNum;}
    string getPhoneNum() const {return phoneNumber;}
private:
    string phoneNumber;
    float availableBalance;
};

    class accountStore { //made to store 100 prepaid accounts
        public:
               accountStore (int size = 0) : accts(size) { }
                  ....
        private:
              prepaidAccount accts[100]; 
}

主要是我只需拨打accountStore Account;

绝对欢迎任何帮助。我最近开始学习c ++以及类和构造函数,所以请耐心等待。

由于

2 个答案:

答案 0 :(得分:1)

  1. 您无法使用int accountStore (int size = 0) : accts(size) {}初始化数组。

  2. prepaidAccount没有默认构造函数,你必须编写成员初始化列表,如

    accountStore (int size = 0) : accts{prepaidAccount(...), prepaidAccount(...), ...} { }

  3. 阵列有100个元素,这里不是一个实用的解决方案。

    作为建议,请考虑std::vector,其constructor构造具有指定值的元素的spicified数。如,

    class accountStore {
        public:
            accountStore (int size = 0) : accts(size, prepaidAccount(...)) { }
                  ....
        private:
            std::vector<prepaidAccount> accts; 
    };
    

答案 1 :(得分:0)

鉴于您已指定您不想使用诸如std :: vector之类的容器但希望在运行时指定大小,您唯一的选择是自己手动实现动态分配。另外,假设您希望一次创建100个对象,我建议创建一个可以根据需要构造临时对象的函数,然后使用它来初始化动态分配的数组。考虑以下代码作为一个很好的起点。 (警告未经测试的代码。)

class prepaidAccount {
 public:
  // Constructor
  prepaidAccount(string newPhoneNum, float newAvailBal)
      : phoneNumber(newPhoneNum), availableBalance(newAvailBal) {}
  // Default Constructor needed for dynamic allocation.
  prepaidAccount() {}

  /* your code*/
};

// Used to construct a tempoary prepaid account for copying to the array.
// Could use whatever constructor you see fit.
prepaidAccount MakePrepaidAccount(/*some parameters*/) {
  /* Some code to generate account */
  return some_var;
}

class accountStore {
 public:
  // Explicit constructor to avoid implicit type-casts.
  explicit accountStore(const int &size = 0)
      : accts(new prepaidAccount[size]) {
    for (int i = 0; i < size; i++) {
      // Will call defualt assignment function.
      prepaidAccount[i] = MakePrepaidAccount(/*some parameters*/);
    }
  }

  // Destructor
  ~accountStore() {
    // Cleans up dynamically allocated memory.
    delete[] prepaidAccount;
  }

  prepaidAccount *accts;
};

编辑:在c ++社区中,当有如此优秀且全面的智能指针库时,选择使用动态分配通常会产生疑问。例如,std::vector在这种情况下是完美的。