如何在C ++中创建对象数组?

时间:2014-09-23 07:22:38

标签: c++ c++11

我是C ++的新手。我来自Java背景。我有两个名为SalesPersonSalesPeople的课程。

我想在SalesPerson类中创建一个SalesPeople数组。下面是我的程序,我得到一些编译错误。

#include <iostream>
using namespace std;

class SalesPerson {

    private:
    string name;
    static const int MONTHS = 12;
    double salesPerMonthArray[MONTHS];

    public:
    SalesPerson(string name, double salesPerMonthArray[]) {

        this->name = name;

        for(int i = 0; i < MONTHS; i++) {
            this->salesPerMonthArray[i] = salesPerMonthArray[i];
        }
    }

    string getName() {
        return name;
    }

    double getSalesForAMonth(int month) {

        if(month < MONTHS) {
            return salesPerMonthArray[month];
        }
        return salesPerMonthArray[0];
    }

    double computeAnnualSales() {

        double annualSales = 0.0;
        for(int i = 0; i < MONTHS; i++) {
            annualSales += salesPerMonthArray[i];
        }

        return annualSales;
    }
};

class SalesPeople {

    private:
        int index = 0;
        SalesPerson salesPersonArray[10];

    public:

        void addSalesPerson(SalesPerson salesPerson) {
            salesPersonArray[index] = salesPerson;
            index++;
        }

        SalesPerson getSalesPerson(int index) {
            return salesPersonArray[index];
        }
};

int main() {

    double salesArray[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
    SalesPeople salesPeople;

    SalesPerson salesPerson1("yaswanth", salesArray);

    salesPeople.addSalesPerson(salesPerson1);

    return 0;
}

编译错误:

prog.cpp: In function ‘int main()’:
prog.cpp:65:14: error: use of deleted function ‘SalesPeople::SalesPeople()’
  SalesPeople salesPeople;
              ^
prog.cpp:44:7: note: ‘SalesPeople::SalesPeople()’ is implicitly deleted because the default definition would be ill-formed:
 class SalesPeople {
       ^
prog.cpp:44:7: error: no matching function for call to ‘SalesPerson::SalesPerson()’
prog.cpp:44:7: note: candidates are:
prog.cpp:12:2: note: SalesPerson::SalesPerson(std::string, double*)
  SalesPerson(string name, double salesPerMonthArray[]) {
  ^
prog.cpp:12:2: note:   candidate expects 2 arguments, 0 provided
prog.cpp:4:7: note: SalesPerson::SalesPerson(const SalesPerson&)
 class SalesPerson {
       ^
prog.cpp:4:7: note:   candidate expects 1 argument, 0 provided
prog.cpp:4:7: note: SalesPerson::SalesPerson(SalesPerson&&)
prog.cpp:4:7: note:   candidate expects 1 argument, 0 provided

然后我尝试创建一个空构造函数,我得到了以下错误。

prog.cpp: In constructor ‘SalesPeople::SalesPeople()’:
prog.cpp:51:17: error: no matching function for call to ‘SalesPerson::SalesPerson()’
   SalesPeople() {
                 ^
prog.cpp:51:17: note: candidates are:
prog.cpp:12:2: note: SalesPerson::SalesPerson(std::string, double*)
  SalesPerson(string name, double salesPerMonthArray[]) {
  ^
prog.cpp:12:2: note:   candidate expects 2 arguments, 0 provided
prog.cpp:4:7: note: SalesPerson::SalesPerson(const SalesPerson&)
 class SalesPerson {
       ^
prog.cpp:4:7: note:   candidate expects 1 argument, 0 provided
prog.cpp:4:7: note: SalesPerson::SalesPerson(SalesPerson&&)
prog.cpp:4:7: note:   candidate expects 1 argument, 0 provided
prog.cpp: In constructor ‘SalesPeople::SalesPeople()’:
prog.cpp:51:17: error: no matching function for call to ‘SalesPerson::SalesPerson()’
   SalesPeople() {
                 ^
prog.cpp:51:17: note: candidates are:
prog.cpp:12:2: note: SalesPerson::SalesPerson(std::string, double*)
  SalesPerson(string name, double salesPerMonthArray[]) {
  ^
prog.cpp:12:2: note:   candidate expects 2 arguments, 0 provided
prog.cpp:4:7: note: SalesPerson::SalesPerson(const SalesPerson&)
 class SalesPerson {
       ^
prog.cpp:4:7: note:   candidate expects 1 argument, 0 provided
prog.cpp:4:7: note: SalesPerson::SalesPerson(SalesPerson&&)
prog.cpp:4:7: note:   candidate expects 1 argument, 0 provided

如何在C ++中创建用户定义对象数组?

1 个答案:

答案 0 :(得分:4)

您完全按照尝试创建数组:Type varname[size];。必须初始化数组中的实例,因为您没有提供任何参数,所以类型必须具有默认构造函数,因为编译错误指示。

您似乎已正确解释错误,但您可能只给出了SalesPeople的默认构造函数。该类包含一个SalesPerson数组,如果你不给SalesPerson一个默认构造函数,你也会遇到同样的问题。

在Java中,非基本对象(无论是在数组中,还是绑定到变量)实际引用指向内存中的对象。实际对象对程序员是隐藏的,只能通过引用访问。 Java引用可以设置为null,这意味着它不指向任何对象。这就是新创建的数组中的所有引用都被设置为的原因,这就是为什么你不需要默认的构造函数来定义Java中的对象数组。

在c ++中,没有值是引用或指针(除非类型本身是引用/指针)。只有指针才能有nullptr值。分配数组后,构造内部的所有对象。在c ++中,指针数组的行为更像是Java中的对象数组,并且不要求指向类型是默认构造的,但我建议使用对象数组,除非你需要一个兄弟类型的对象数组继承了一个共同的基础。

您可能想要考虑是否有一组默认的初始化对象而不是一个空的std::vector是否填充了使用参数构造的对象。

如果你知道定义数组时的参数,那么 也可能有一个非默认构造对象的数组:Type varname[size]{{PARAMS0}, {PARAMS1}, ...};其中{{1}是新构造的对象的参数列表。