简体   繁体   中英

c++ error: array initializer must be an initializer list

I have really been struggling with a piece of code for a couple days. The error message i receive when i run my code is: error: array initializer must be an initializer list accountStore (int size = 0) : accts(size) { }

There seem to be others with similar problems here but unfortunately I am unable to apply their solutions (either don't work or not applicable).

What I am simply attempting to do is create a container class (array, can't use vectors) of a class 'prepaidAccount' but I am just unable to get the constructor portion of the container class 'storeAccount' to work. See code snippet below:

    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]; 
}

In main I simply call accountStore Account;

Any help is absolutely welcome. I very recently started learning c++ and about classes and constructors so please bear with me.

Thanks

  1. You can't initialize an array with int like accountStore (int size = 0) : accts(size) {} .

  2. prepaidAccount doesn't have a default constructor, you have to write member initialization list like,

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

The array has 100 elements, it's not a practical solution here.

As a suggestion, think about std::vector , which has a constructor constructing with the spicified count of elements with specified value. Such as,

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

Given that you have specified that you do not want to use a container such as std::vector but would like to specify the size at runtime, your only option would be to manually implement dynamic allocation yourself. Also given that you are wanting create 100 objects at a time, I would suggest making a function that can construct a temporary object according to your needs and then use this to initialise your dynamically allocated array. Consider the below code as a good starting point. (WARNING untested code.)

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

Edit: Amongst the c++ community it is often questionable when choosing to use dynamic allocation when there is such an excellent and comprehensive library of smart pointers. For example an std::vector would be perfect in this situation.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM