Kế thừa và hàm dựng

#include <iostream>
using namespace std;
class rectangle
{
protected:
    int width,height;
public:
    rectangle(int, int );
    void input(istream &input);
    int area();

};
class square:public rectangle
{
public:
    square(int a=0);
    void input(istream &indev);
};
rectangle::rectangle(int a,int b)
{
    height=a;
    width=b;
}
void rectangle::input(istream &indev)
{
    indev>>width>>height;
}
int rectangle:: area()
{
    return width*height;
}
square::square(int a)
{
    width=height=a;
}
void square::input(istream& indev)
{
    indev>>width;
    height=width;
}
int main()
{
    rectangle a;
    square b;
    a.input(cin);
    cout<<a.area()<<endl;
    b.input(cin);
    cout<<b.area()<<endl;

}

Đây là lỗi khi mình build:

 ||=== Build: Debug in singleton (compiler: GNU GCC Compiler) ===|
 Power of Chaos Common\singleton\main.cpp||In constructor 'square::square(int)':|
 Power of Chaos Common\singleton\main.cpp|32|error: no matching function for call to 'rectangle::rectangle()'|
 Power of Chaos Common\singleton\main.cpp|19|note: candidate: rectangle::rectangle(int, int)|
 Power of Chaos Common\singleton\main.cpp|19|note:   candidate expects 2 arguments, 0 provided|
 Power of Chaos Common\singleton\main.cpp|3|note: candidate: rectangle::rectangle(const rectangle&)|
 Power of Chaos Common\singleton\main.cpp|3|note:   candidate expects 1 argument, 0 provided|
 Power of Chaos Common\singleton\main.cpp||In function 'int main()':|
 Power of Chaos Common\singleton\main.cpp|43|error: no matching function for call to 'rectangle::rectangle()'|
 Power of Chaos Common\singleton\main.cpp|19|note: candidate: rectangle::rectangle(int, int)|
 Power of Chaos Common\singleton\main.cpp|19|note:   candidate expects 2 arguments, 0 provided|
 Power of Chaos Common\singleton\main.cpp|3|note: candidate: rectangle::rectangle(const rectangle&)|
 Power of Chaos Common\singleton\main.cpp|3|note:   candidate expects 1 argument, 0 provided|
 Power of Chaos Common\singleton\main.cpp|44|error: no matching function for call to 'square::square()'|
 Power of Chaos Common\singleton\main.cpp|32|note: candidate: square::square(int)|
 Power of Chaos Common\singleton\main.cpp|32|note:   candidate expects 1 argument, 0 provided|
 Power of Chaos Common\singleton\main.cpp|13|note: candidate: square::square(const square&)|
 Power of Chaos Common\singleton\main.cpp|13|note:   candidate expects 1 argument, 0 provided|
||=== Build failed: 3 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|

Bạn nào chỉ cho mình lỗi mình mắc phải?

Trong main bạn có khai báo như vầy:

    rectangle a;

Mà trong class rectangle không có constructor rectangle(). @@

Thêm :point_down: vô class là được. :kissing:

    rectangle() {
        width = 0;
        height = 0;
    }
5 Likes
#include <iostream>
using namespace std;
class figures
{
public:
    figures();
    virtual int area();
    virtual void input(istream& indev);
};
figures::figures(){}
int figures::area()
{
    return 0;
}
void figures::input(istream&indev)
{

}
class rectangle:public figures
{
protected:
    int width,height;
public:
    rectangle(int,int );
    virtual void input(istream &input);
    virtual int area();

};
rectangle::rectangle(int a,int b)
{
    height=a;
    width=b;
}
void rectangle::input(istream &indev)
{
    indev>>width>>height;
}
int rectangle:: area()
{
    return width*height;
}
class square:public rectangle
{
public:
    square(int );
    void input(istream &indev);
};
square::square(int a)
{
    width=height=a;
}
void square::input(istream& indev)
{
    indev>>width;
    height=width;
}

int main()
{

    rectangle a(2,3);
}

Mình viết lại và thay rectangle a(2,3) nhưng ko được nó vẫn bị lỗi này nè bạn

 Power of Chaos Common\singleton\main.cpp|48|error: no matching function for call to 'rectangle::rectangle()'|

DNH - Sử dụng markdown

2 Likes

Vấn đề này là do class Square của bạn kế thừa class Rectangle. Nên constructor của Square sẽ tự động gọi default constructor của class Rectangle => failed
Giải pháp là: hoặc bạn thêm default constructor cho class Rectangle, hoặc là chủ động gọi constructor mong muốn khi khởi tạo class Square:

 square::square(int a): rectangle(a, a){
// Không cần gán width và height ở đây vì đã được constructor của Rectangle gán rồi
}```
4 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?