C ++继承 - 文件

时间:2016-01-12 12:38:06

标签: c++ class

我试图将一个类及其超类分成两个不同的头文件和cpp文件。在主要方法中,我想要包括它们。

目前我的主程序 example.cpp 如下所示:

#include <iostream>
#include "header.h"

using namespace std;

int main(void)
{
   Rectangle Rect;

   Rect.setWidth(5);
   Rect.setHeight(7);

   // Print the area of the object.
   cout << "Total area: " << Rect.getArea() << endl;

   return 0;
}

我的Rectangle.cpp是这样的:

#include <iostream>
#include "Shape.h"
#include "Rectangle.h"
using namespace std;


int getArea()
{ 
    return (Shape::width * Shape::height); 
}

我的Rectangle.h:

class Rectangle: public Shape
{
public:
      int getArea();
};

Shape.cpp:

#include <iostream>
#include "Shape.h"
using namespace std;

void Shape::setWidth(int w)
{
    width = w;
}

void Shape::setHeight(int h)
{
    height = h;
}

和Shape.h:

class Shape 
{
public:
    void setWidth(int w);
    void setHeight(int h);
    int width;
    int height;
};

header.h 只包含两个类的标题:

#include "Shape.h"
#include "Rectangle.h"

如果我编译它,编译器说:

Lukass-MacBook-Pro:Oberklassenbeispiel Lukas$ g++ -c Rectangle.cpp
Rectangle.cpp:9:17: error: invalid use of non-static data member 'width'
        return (Shape::width * Shape::height); 
                ~~~~~~~^~~~~
Rectangle.cpp:9:32: error: invalid use of non-static data member 'height'
        return (Shape::width * Shape::height); 
                               ~~~~~~~^~~~~~
2 errors generated.

似乎Rectanlge.cpp无法看到超类的属性。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

当您使用#include时,您提供文件名,而不是文件中指定的类。在单个文件中具有多个紧密耦合的类是很常见的。你的例子并不是最好的(它是单一的继承,而不是标题所暗示的多重),但是使用它......

您可以拥有一个包含以下内容的shapes.h文件:

class Shape 
{
public:
      void setWidth(int w)
      {
          width = w;
      }
    void setHeight(int h)
    {
       height = h;
    }
 protected:
    int width;
    int height;
};

// Derived class
class Rectangle: public Shape
{
public:
    int getArea()
    { 
        return (width * height); 
    }
};

然后在你的主函数(和包含它的文件)中。

#include <iostream>
#include "shapes.h"
int main(void)
{
   Rectangle Rect;

   Rect.setWidth(5);
   Rect.setHeight(7);

   // Print the area of the object.
   cout << "Total area: " << Rect.getArea() << endl;

   return 0;
}