0

我不明白为什么这个程序不起作用。我是 C++ 新手,在使用 Java 三年后切换。我认为 Java 中的错误消息毫无意义,但我在 C++ 中遇到的错误只是胡言乱语。这是我真正能理解的。

无论如何,所以我有一个具有 Rectangle 和 Square 类的程序。square 类继承自 rectangle 类。我所有的课程都在不同的文件中。

==================================(主)

#include <iostream>
#include "Rectangle.h"
#include "Square.h"

using namespace std;

    int main(){

        Square sq;

    }//end main

=================================(Rectangle.h)

#ifndef RECTANGLE_H
#define RECTANGLE_H

class Rectangle{

    public:

        Rectangle (int, int);

        void setLength (int);

        void setWidth (int);

        int getLength ();

        int getWidth ();

        int getArea ();

    private:

         int length;
         int width;

};

#endif // RECTANGLE_H

==================================(Rectangle.cpp)

#include <iostream>
#include "Rectangle.h"
#include "Square.h"

using namespace std;

    Rectangle :: Rectangle (int len, int wid){
        length = len;
        width = wid;
    }//end constructor

    void Rectangle :: setLength (int l){
        length = l;
    }//end setLength

    void Rectangle :: setWidth (int w){
        width = w;
    }//end setWidth

    int Rectangle :: getLength (){
        return length;
    }//end getLength

    int Rectangle :: getWidth (){
        return width;
    }//end getWidth

    int Rectangle :: getArea (){
        return length * width;
    }//end getArea

=========================================(Square.h)

#ifndef SQUARE_H
#define SQUARE_H

class Square : public Rectangle
{

    public:
        Square();

};

#endif // SQUARE_H

=====================================(Square.cpp)

#include <iostream>
#include "Rectangle.h"
#include "Square.h"

using namespace std;

    Square :: Square {

        //super :: Square(4, 3);
        cout << "This is bullshit";

    };

==================================================== =====

4

2 回答 2

2

Square sq;

这将调用默认构造函数,Square其中将首先调用基类的默认构造函数Rectangle。默认构造函数是没有参数的构造函数,或者如果它有参数,则所有参数都有默认值。如果您尚未定义构造函数,C++ 编译器将为您提供一个默认构造函数。由于您已经定义了构造函数Rectangle (int, int),编译器不会提供默认构造函数。这就是错误的原因。

Rectangle解决方案是通过定义一个不带参数的构造函数Rectangle()或为现有构造函数的参数提供默认值的构造函数来为类提供默认构造函数,例如Rectangle(int x=10, int y=20)

于 2013-06-11T04:33:57.793 回答
0

您需要通过初始化列表传递父构造函数参数...

例如,如果默认的 Rectangle 参数是 (4, 3):

Square :: Square( )
  : Rectangle(4, 3) 
{
   //super :: Square(4, 3);
   cout << "This is bullshit";
}

或者,它会更好:

Square :: Square(int len, int wid)
  : Rectangle(len, wid) 
{
}

在头文件中:

class Square : public Rectangle
{
    public:
        Square(int len=4, int width=3);
};
于 2013-06-11T03:58:07.760 回答