2016-01-02 128 views
0

我试图创建一个子类secondary,它可以与参数一起使用以及重写类primary。现在,我得到初始化派生类的构造函数中没有默认构造函数的基类

没有匹配函数来调用

错误。有人能帮助我吗?

我的代码:
primary.h:

#ifndef PRIMARY_H 
#define PRIMARY_H 


class primary 
{ 
    public: 
     primary(int x); 
     virtual ~primary(); 
    protected: 
    private: 
     int primary_x; 
}; 

#endif // PRIMARY_H 

primary.cpp:

#include "primary.h" 

primary::primary(int x) 
{ 
    primary_x = x; 
} 

primary::~primary() 
{ 
    //dtor 
} 

secondary.h:

#ifndef SECONDARY_H 
#define SECONDARY_H 
#include "primary.h" 


class secondary : public primary 
{ 
    public: 
     secondary(); 
     virtual ~secondary(); 
    protected: 
    private: 
}; 

#endif // SECONDARY_H 

secondary.cpp:

#include "secondary.h" 

secondary::secondary() 
{ 
    //ctor 
} 

secondary::~secondary() 
{ 
    //dtor 
} 
+2

的[类可能的复制从类继承,但没有默认构造函数](http://stackoverflow.com/questions/3714162/class-inherited-from-class-without-default-constructor) –

回答

2

因为你没有一个默认的构造函数,编译器抱怨说,它不能创建一个对象primary,您应该为secondary构造函数添加参数/将其设置为默认值:

class secondary : public primary 
{ 
    public: 
     secondary(int x); 
     virtual ~secondary(); 
    protected: 
    private: 
}; 

然后调用基类的构造函数:

secondary::secondary(int x) : primary(x) 
{ 
    //ctor 
} 

或者:

secondary::secondary() : primary(5) 
{ 
    //ctor 
} 

或者只是添加默认构造primary

class primary 
{ 
    public: 
     primary(int x); 
     primary() : primary_x(0) {} 
     virtual ~primary(); 
    protected: 
    private: 
     int primary_x; 
}; 
0
public: 
    secondary(); 

也应该采取一个整数:

public: 
    secondary(int x); 

,然后构造函数的定义:

secondary::secondary(int x) : primary(x) 
{ 
    //ctor 
} 
+1

这不会编译。 – IInspectable

+0

错误是什么?啊,好的,我明白了;)'secondary :: secondary()'应该像int声明一样int。 – xinaiz

+0

你从无处取走了'x'。 – LogicStuff

1

这整个问题看起来你想干的事,但你忘了那是什么,在编写代码的过程中。

primary构造函数需要一个int和它没有得到它,因为

secondary::secondary() { } 

等同于:

secondary::secondary() : primary() { } 

编译器试图通过缺省方式构造primary,但它不是默认的,constructible 。由于您声明了构造函数为int,因此编译器不再生成默认构造函数。

解决方案:

  • 修改派生类的构造函数:

    secondary::secondary() : primary(10) { } // dummy value 
    

    或模仿基类的构造函数的签名:

    secondary::secondary(int x) : primary(x) { } 
    
  • 修改基类 - 让primary默认构造,即声明构造函数:

    primary(int x = 10) // dummy default argument 
    

    或添加默认构造函数重载:

    primary() = default; 
    
相关问题