Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Почему компилятор выдает ошибку, что объявленный класс "has not been declared "?

85K
08 октября 2012 года
Lakroft
6 / / 04.10.2012
Имеется программа, во время компиляции на Dev-C++ выпадает ошибка "`Rectangle' has not been declared " :

Код:
#include <cstdlib>
#include <iostream>

using namespace std;
#include "Rect.hpp"
#include "Rect.cpp"

int main(int argc, char *argv[])
{
    setlocale(LC_ALL, "Russian");
   
    Rectangle MyRectangle (100, 20, 50, 80);  //
   
    int Area = MyRectangle.GetArea();
   
    cout << "Area = "<<Area<<endl;
    cout <<"Upper Left X coordinate: ";
    cout <<MyRectangle.GetUpperLeft().GetX();
   
    cout<<"\n\n\t\t";
    system("PAUSE");
    return EXIT_SUCCESS;
}
Файл Rect.hpp


Код:
#include <cstdlib>
#include <iostream>

using namespace std;

class Point  
{
             
      public:
             void SetX(int x) {itsX = x;}
             void SetY(int y) {itsY = y;}
             int GetX() const {return itsX;}
             int GetY() const {return itsY;}
      private:
              int itsX;
              int itsY;
};              

class Rectangle
{
      public:
             Rectangle (int top, int left, int bottom, int right);
             ~Rectangle() {}
             
             int GetTop() const {return itsTop;}
             int GetLeft() const {return itsLeft;}
             int GetBottom() const {return itsBottom;}
             int GetRight() const {return itsRight;}
             
             Point GetUpperLeft() const {return itsUpperLeft;}
             Point GetLowerLeft() const {return itsLowerLeft;}
             Point GetUpperRight() const {return itsUpperRight;}
             Point GetLowerRight() const {return itsLowerRight;}
             
             void SetUpperLeft(Point Location) {itsUpperLeft = Location;}
             void SetLowerLeft(Point Location) {itsLowerLeft = Location;}
             void SetUpperRight(Point Location) {itsUpperRight = Location;}
             void SetLowerRight(Point Location) {itsLowerRight = Location;}
             
             void SetTop(int top) {itsTop = top;}
             void SetLeft(int left) {itsLeft = left;}
             void SetBottom(int bottom) {itsBottom = bottom;}
             void SetRight(int right) {itsRight = right;}
             
             int GetArea() const;
             
      private:
              Point itsUpperLeft;
              Point itsUpperRight;
              Point itsLowerLeft;
              Point itsLowerRight;
              int itsTop;
              int itsLeft;
              int itsBottom;
              int itsRight;
};
Файл Rect.cpp


Код:
#include <cstdlib>
#include <iostream>

using namespace std;


Rectangle::Rectangle(int top, int left, int bottom, int right)
{
    itsTop = top;
    itsLeft = left;
    itsBottom = bottom;
    itsRight = right;
   
    itsUpperLeft.SetX(left);
    itsUpperLeft.SetY(top);
   
    itsUpperRight.SetX(right);
    itsUpperRight.SetY(top);
   
    itsLowerLeft.SetX(left);
    itsLowerLeft.SetY(bottom);
   
    itsLowerRight.SetX(right);
    itsLowerRight.SetY(bottom);
}

int Rectangle::GetArea() const
{
    int Width = itsRight - itsLeft;
    int Height = itsTop - itsBottom;
    return (Width * Height);
}
Если удалить из проекта файл Rect.cpp, но оставить строку "#include "Rect.cpp" " все компилируется и работает. Объясните нубу в чем ошибка.
70K
08 октября 2012 года
ProkletyiPirat
76 / / 25.07.2012
У тебя неподрублен Rect.hpp в Rect.cpp от того компилятор и пишет что Rectangle неизвестен в нем

Rect.hpp

Код:
#ifndef Rect_hpp //проверка подрублен ли Rect.hpp (вместо точки нижнее подчёркивание)
#define Rect_hpp //если не подрублен то подрубить

#include <cstdlib>
#include <iostream>

using namespace std;

class Point  
{
             
      public:
             void SetX(int x) {itsX = x;}
             void SetY(int y) {itsY = y;}
             int GetX() const {return itsX;}
             int GetY() const {return itsY;}
      private:
              int itsX;
              int itsY;
};              

class Rectangle
{
      public:
             Rectangle (int top, int left, int bottom, int right);
             ~Rectangle() {}
             
             int GetTop() const {return itsTop;}
             int GetLeft() const {return itsLeft;}
             int GetBottom() const {return itsBottom;}
             int GetRight() const {return itsRight;}
             
             Point GetUpperLeft() const {return itsUpperLeft;}
             Point GetLowerLeft() const {return itsLowerLeft;}
             Point GetUpperRight() const {return itsUpperRight;}
             Point GetLowerRight() const {return itsLowerRight;}
             
             void SetUpperLeft(Point Location) {itsUpperLeft = Location;}
             void SetLowerLeft(Point Location) {itsLowerLeft = Location;}
             void SetUpperRight(Point Location) {itsUpperRight = Location;}
             void SetLowerRight(Point Location) {itsLowerRight = Location;}
             
             void SetTop(int top) {itsTop = top;}
             void SetLeft(int left) {itsLeft = left;}
             void SetBottom(int bottom) {itsBottom = bottom;}
             void SetRight(int right) {itsRight = right;}
             
             int GetArea() const;
             
      private:
              Point itsUpperLeft;
              Point itsUpperRight;
              Point itsLowerLeft;
              Point itsLowerRight;
              int itsTop;
              int itsLeft;
              int itsBottom;
              int itsRight;
};

#endif //конец для #define
ну и указываем что Rectangle и GetArea находится в другом файле и их ненадо заного создавать
Rect.cpp
Код:
#include <cstdlib>
#include <iostream>
#include "Rect.hpp"
using namespace std;


extern Rectangle::Rectangle(int top, int left, int bottom, int right)
{
    itsTop = top;
    itsLeft = left;
    itsBottom = bottom;
    itsRight = right;
   
    itsUpperLeft.SetX(left);
    itsUpperLeft.SetY(top);
   
    itsUpperRight.SetX(right);
    itsUpperRight.SetY(top);
   
    itsLowerLeft.SetX(left);
    itsLowerLeft.SetY(bottom);
   
    itsLowerRight.SetX(right);
    itsLowerRight.SetY(bottom);
}

extern int Rectangle::GetArea() const
{
    int Width = itsRight - itsLeft;
    int Height = itsTop - itsBottom;
    return (Width * Height);
}

проверил только на компиляцию в VS2010
85K
08 октября 2012 года
Lakroft
6 / / 04.10.2012
Не понятно, почему в файл Rect.hpp нужно подрубать этот-же Rect.hpp. У меня заработало после пары изменений:
  • В файле Rect.hpp:
поменял строки
#ifndef Rect_hpp
#define Rect_hpp
на
#ifndef Rect_сpp
#define Rect_сpp

Код:
#ifndef Rect_cpp //проверка подрублен ли Rect.cpp
#define Rect_cpp //если не подрублен то подрубить

#include <cstdlib>
#include <iostream>

using namespace std;

class Point  
{
             
       public:
              void SetX(int x) {itsX = x;}
              void SetY(int y) {itsY = y;}
              int GetX() const {return itsX;}
              int GetY() const {return itsY;}
       private:
               int itsX;
               int itsY;
};              

class Rectangle
{
       public:
              Rectangle (int top, int left, int bottom, int right);
              ~Rectangle() {}
             
              int GetTop() const {return itsTop;}
              int GetLeft() const {return itsLeft;}
              int GetBottom() const {return itsBottom;}
              int GetRight() const {return itsRight;}
             
              Point GetUpperLeft() const {return itsUpperLeft;}
              Point GetLowerLeft() const {return itsLowerLeft;}
              Point GetUpperRight() const {return itsUpperRight;}
              Point GetLowerRight() const {return itsLowerRight;}
             
              void SetUpperLeft(Point Location) {itsUpperLeft = Location;}
              void SetLowerLeft(Point Location) {itsLowerLeft = Location;}
              void SetUpperRight(Point Location) {itsUpperRight = Location;}
              void SetLowerRight(Point Location) {itsLowerRight = Location;}
             
              void SetTop(int top) {itsTop = top;}
              void SetLeft(int left) {itsLeft = left;}
              void SetBottom(int bottom) {itsBottom = bottom;}
              void SetRight(int right) {itsRight = right;}
             
              int GetArea() const;
             
       private:
               Point itsUpperLeft;
               Point itsUpperRight;
               Point itsLowerLeft;
               Point itsLowerRight;
               int itsTop;
               int itsLeft;
               int itsBottom;
               int itsRight;
};

#endif //конец для #define
  • В файле main
Удалил строку #include "Rect.cpp"



Код:
#include <cstdlib>
#include <iostream>

using namespace std;
#include "Rect.hpp"

int main(int argc, char *argv[])
{
     setlocale(LC_ALL, "Russian");
     
     Rectangle MyRectangle (100, 20, 50, 80);  //
     
     int Area = MyRectangle.GetArea();
     
     cout << "Area = "<<Area<<endl;
     cout <<"Upper Left X coordinate: ";
     cout <<MyRectangle.GetUpperLeft().GetX();
     
     cout<<"\n\n\t\t";
     system("PAUSE");
     return EXIT_SUCCESS;
}
70K
08 октября 2012 года
ProkletyiPirat
76 / / 25.07.2012
Цитата: Lakroft
Не понятно, почему в файл Rect.hpp нужно подрубать этот-же Rect.hpp.



 
Код:
#ifndef Rect_hpp //проверка подрублен ли Rect.hpp (вместо точки нижнее подчёркивание)
#define Rect_hpp //если не подрублен то подрубить
//Rect.hpp
#endif //конец для #define
тоже самое что

 
Код:
if("Rect.hpp" подключен?) ничего неделать
else подключить Rect.hpp
нужно для того чтобы дважды неподключать Rect.hpp (в Rect.cpp и Main.cpp) если этого не сделать то он будет рекурсивно подключаться и не скомпилируется...
а подключать нужно в каждом файле.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог