在另一个类中创建一个对象(没有继承)

时间:2013-11-16 21:25:22

标签: c++

大家好=)问题:Compilier无法执行类oper的构造函数,因为类person中没有默认的构造函数。 错误的文字: 'person':没有合适的默认构造函数

问题是:如何在不创建默认构造函数和没有继承的情况下解决此问题。 这是班上人的代码:

  class person:public gsm
{
public:
    string name,tel;
    int tax;
public:
    person(string m);
    person(string m,string t,string n,int a);
    void input(string n, string t, int tx);
    void output();
    person& operator=(person& a);
    bool operator==(person& a);
    bool operator!=(person& a);
};

这是类操作符:

class oper
{
private:
    person b[10];
    int mid_tax1,mid_tax2;
public:
    oper();
    void set_t1(int tax);
    void set_t2(int tax);
    void count();
    void add_person(person a,int i);
    void out();
};

类oper的构造函数:

oper::oper()
{
    this->mid_tax1=0;
    this->mid_tax2=0;
    for(int i=0;i<10;i++)
    {
        b[i].tel="";
        b[i].name="";
        b[i].tax=0;
    }
}

2 个答案:

答案 0 :(得分:1)

class oper包含10个人的实例。要构建oper,你必须构建10个实例。

当你在oper :: oper的构造函数中时,你就是在类之后并且构造了它的内容。由于没有人的默认构造函数,编译器无法构建操作。

  • 为什么不允许您使用默认构造函数?

  • 为什么要创建一个包含10个人的固定数组,然后支持名为add_person的函数?人数是固定的还是动态的?

    如果您使用的是C ++ 03 / C ++ 11,则可以使用初始化程序列表在构造期间将值传递给人员的Ctor。但它不会是一段漂亮的代码。

    oper::oper()
      : b({""},{""} .... ), mid_tax1(0), mid_tax2(0) 
    {
      ...
    }
    

    正确的解决方案是添加默认构造函数或从固定的10人阵列移动到N人的动态容器

  • 答案 1 :(得分:1)

    使用std :: list而不是数组。