2016-06-14 4 views
-4

Я пытаюсь использовать функцию, которую у меня есть в базовом классе «SHAPE», с производным классом «RECTANGLE» для создания большего прямоугольника в моем классе «BIGRECTANGLE». Я хочу, чтобы мои стороны трансформировались внутри класса, а не в основном, что мне делать? Благодаря!Вложенные классы и наследование

#include <iostream> 

using namespace std; 

// Base class Shape 
class Shape 
{ 
public: 

    void ResizeW(int w) 
    { 
     width = w; 
    } 
    void ResizeH(int h) 
    { 
     height = h; 
    } 
protected: 

    int width; 
    int height; 
}; 

// Primitive Shape 

class Rectangle: public Shape 
{ 
public: 

    int width = 2; 
    int height = 1; 
    int getArea() 
    { 
     return (width * height); 
    } 
}; 

// Derived class 

class BIGRectangle: public Rectangle 
{ 
public: 

    int area; 
    Rectangle.ResizeW(8); 
    Rectangle.ResizeH(4); 
    area = Rectangle.getArea(); 
}; 

int main(void) 
{ 
    return 0; 
} 

Эти ошибки, которые у меня есть: - 45:14: ошибка: ожидается, неквалифицированный-идентификатор, прежде чем ". токен - 46:14: ошибка: ожидаемый неквалифицированный идентификатор до '.' токен - 47: 5: ошибка: «площадь» не называет тип

+1

Поместите это в конструктор или что-то еще ... Знаете ли вы, что такое конструкторы? Вы не используете их. – LogicStuff

+0

@LogicStuff вы можете помочь мне разобраться? – FL93

+0

Вот ссылка на [tutorial] (http://www.cplusplus.com/doc/tutorial/classes/) на конструкторах. И еще одна ссылка на [inheritance] (https: // www.cs.bu.edu/teaching/cpp/inheritance/intro/). Читай их; Google - ваш друг. – NonCreature0714

ответ

1

Есть время и место для всего. В

class BIGRectangle: public Rectangle 
{ 
public: 

    int area; 
    Rectangle.ResizeW(8); 
    Rectangle.ResizeH(4); 
    area = Rectangle.getArea(); 
}; 

лучшее место для инициализации членов класса в это Member Initializer List конструктора. Например:

class BIGRectangle: public Rectangle 
{ 
public: 

    int area; 

    BIGRectangle():Rectangle(8, 4), area(getArea()) 
    { 
    } 
}; 

Это говорит о том, построить мне BIGRectangle, который сделан из Rectangle, который 8 на 4 и сохраняет Rectangle «s вычисляется area.

Для этого требуется Rectangle, чтобы иметь конструктор, требующий высоты и ширины.

class Rectangle: public Shape 
{ 
public: 

    // no need for these because they hide the width and height of Shape 
    // int width = 2; 
    // int height = 1; 
    Rectangle(int width, int height): Shape(width, height) 
    { 

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

Это дополнение создает Rectangle, который использует Shape «s width и height, а не свои собственные. Когда заданы два имени в одном и том же месте, компилятор выберет тот, который был объявлен самым большим, и скроет внешнее, и это приведет к путанице и несчастным случаям. Rectangle видит его width и height и нуждается в помощи, чтобы увидеть те, которые определены в Shape. Shape не имеет понятия, что Rectangle даже существует, потому что Rectangle был определен после Shape. В результате Shape видит только свои width и height.

Это приводит к некоторым реальным неприятным juju, когда вы звоните getArea. Текущая версия содержит Shapewidth и height и использует Rectanglewidth и height для того, чтобы рассчитать эту область. Не то, что вы хотите.

И что требует Shape иметь конструктор, который принимает ширину и высоту

class Shape 
{ 
public: 
    Shape(int inwidth, 
      int inheight): width(inwidth), height(inheight) 
    { 

    } 
    void ResizeW(int w) 
    { 
     width = w; 
    } 
    void ResizeH(int h) 
    { 
     height = h; 
    } 
protected: 

    int width; 
    int height; 
}; 

Обратите внимание, как параметр inwidth, не width. Это не является строго необходимым, но плохая форма использовать одно и то же имя дважды в одном месте или в непосредственной близости по тем же причинам, что и выше: одно и то же имя в одном и том же месте в то же время плохое.

Но это задает вопрос о том, что происходит, когда у вас есть Circle, который является Shape. Круги не имеют ширины и высоты, поэтому вы можете переосмыслить Shape.

+0

Это отличное спасибо! – FL93

+0

Не совсем идеально. Иерархия падает, как только у вас есть непрямоугольные формы. Каждый слой обратно к корню в иерархии объектов должен знать меньше, чем предыдущий, потому что он должен быть более абстрактным. Форма знает точно так же, как и Rectangle, и это предотвращает появление Shape из круга, треугольника или чего-то еще, что не является прямоугольным. Форма должна быть действительно, действительно, * действительно * тупой. Он ничего не должен знать. – user4581301