Форум программистов, компьютерный форум CyberForum.ru

Проблемы с много-файловыми объявлениями - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Указатель на виртуальную функцию http://www.cyberforum.ru/cpp-beginners/thread936191.html
#include <stdio.h> #include <conio.h> class A { public: virtual void f(){printf("a\n");}; }; class B:public A
C++ ostream& output Что это за параметр такой, - ostream& output? ostream& operator<< (ostream& output, const Array<T>& theArray) { for (int i = 0; i<theArray.GetSize(); i++) output << " " << theArray << endl; return output; } http://www.cyberforum.ru/cpp-beginners/thread936186.html
C++ Зачем false?
void IntFillFunction(Array<int>& theArray) { bool Stop = false; int offset, value; while (!Stop) { cout << "Enter an offset (0-9) "; cout << "and a value. (-1 to stop): " ; cin >> offset >> value; if (offset < 0)
Указатель, как массив C++
Объясните, пожалуйста, каким образом в 10-ой строке указатель pType ведет себя как массив? template <class T> // declare the template and the parameter class Array // the class being parameterized { public: Array(int itsSize = DefaultSize); Array(const Array &rhs); ~Array() { delete pType; } Array& operator=(const Array&);
C++ ReadProcessMemory http://www.cyberforum.ru/cpp-beginners/thread936171.html
ReadProcessMemory (fProcess.__HandleProcess, (PBYTE*)(fProcess.__dwordClient + Player_Base), &CLocalPlayer, sizeof(DWORD), 0); Объясните пожалуйста эту строку
C++ Моделирование физических процессов 1. Ищу книги на данную тему, все что есть. 2. Что вы думаете про связку C++ с Питоном? т.е. мейн код на плюсах, визуализация на Питоне. Как я понял на Питоне есть отличные библиотеки для таких нужд. Вариант онли Питон не рассматриваю. Делаю сейчас визуализацию на SFML, хоть библиотека и проста, но она заточена под игры. подробнее

Показать сообщение отдельно
Xipxop
 Аватар для Xipxop
481 / 9 / 2
Регистрация: 28.12.2011
Сообщений: 150
10.08.2013, 15:47     Проблемы с много-файловыми объявлениями
Добрый день!
У меня возникла небольшая проблема после того как я стал изучать Win API, мне стало неудобно хранить весь код в одном файле main.cpp
И вот я решил разбить мой проект на несколько частей: Иницилизация окна, main, GameMain
И вот тут я встретился с некоторыми проблемами... (определял в заголовочных файлах)
После этого я разбил Иницилизацию, GameMain по 2 файла .h и .cpp
И вот от этого посыпалось очень много ошибок, причем по факту такими не являются!

Вот кодНенужные тела функций я обрезал)
CreateWindowClass.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#if !CRWNDDEF
#define CRWNDDEF
 
#include <windows.h>
#include "CreateWindowClass.h"
 
//LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
 
class CreateWindowClass{
public:
    WNDCLASS    wndclass;
    UINT        style;                      //Стиль окна
    int         cbClsExtra;int cbWndExtra;  //Доп память
    HICON       hIcon;                      //Иконка
    HCURSOR     hCursor;                    //Мышка
    LPCSTR      lpszMenuName;               //имя меню(???)
    HBRUSH      hbrBackground;              //Цвет фона(серый)
    //-----------------------------------------------------------------------
    LPCTSTR     szAppNam;                   //Указатель на имя класса окна
    LPCTSTR     lpWindowName;               //Указатель на имя окна
    DWORD       dwStyle;                    //Стиль окна
    int         x;int y;                    //Начальное положение экрана
    int         xWidth;int yHeight;         //Ширина и высота экрана
    HWND        hWndParent;                 //Родитель
    HMENU       hMenu;                      //Меню
    HINSTANCE   hInstance;                  //Дескриптор экземпляра приложения
    LPVOID      lpParam;                    //Указатель на данные созданного окна
    //-----------------------------------------------------------------------
    HWND        hwnd;
    int         iCmdShow;
    //-----------------------------------------------------------------------
 
    CreateWindowClass(HINSTANCE hInst, int iCmdSh, LPCTSTR AppName=TEXT("TEXT1"), LPCTSTR WndName=TEXT("Dialog Window"), int xM=800, int yM=600){
        style = CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS; 
        cbClsExtra = 0;
        cbWndExtra = 0;             
        hIcon = LoadIcon(NULL, IDI_APPLICATION); 
        hCursor = LoadCursor(NULL, IDC_ARROW);   
        lpszMenuName = NULL;
        hbrBackground =(HBRUSH)1;
        //-----------------------------------------------------------------------
        szAppNam    = AppName;         
        lpWindowName = WndName; 
        dwStyle = WS_SYSMENU|WS_MINIMIZEBOX; //CS_HREDRAW|CS_VREDRAW|CS_DBLCLKS
        x = 100; 
        y = 100;                            
        xWidth = xM; 
        yHeight = yM;            
        hWndParent = NULL;                    
        hMenu = NULL;                         
        lpParam = NULL;  
        hInstance = hInst;
        iCmdShow = iCmdSh;
    }
 
    ATOM RegMyWindowClass()
    {
        wndclass.lpfnWndProc    = WndProc;
        wndclass.style          = style;
        wndclass.cbClsExtra     = cbClsExtra;
        wndclass.cbWndExtra     = cbWndExtra;
        wndclass.hInstance      = hInstance;
        wndclass.hIcon          = hIcon;
        wndclass.hCursor        = hCursor;
        wndclass.lpszMenuName   = NULL;
        wndclass.lpszClassName  = szAppNam;
        wndclass.hbrBackground  = hbrBackground;
 
        return RegisterClass(&wndclass);
    }
    bool CrWindow()
    {
        hwnd=CreateWindow(szAppNam, lpWindowName, dwStyle, x, y, xWidth, yHeight, hWndParent, hMenu, hInstance, lpParam);
        ShowWindow(hwnd, iCmdShow);
        UpdateWindow(hwnd);
        return (hwnd != NULL);
    }
};
 
#endif

CreateWindowClass.h
C++
1
2
3
4
5
6
7
8
9
#if !WNDCLASS
#define WNDCLASS
 
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
class CreateWindowClass;
 
 
 
#endif

main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
//Обзор возможностей WinAPI
#pragma comment(lib,"Winmm.lib") //Библиотека произведения звуков
#include <windows.h>
#include "CreateWindowClass.h"
#include "GameMain.h"
#include <cstring>
//--Определения
//
#define OHWND CrWind.hwnd
//
//----Globals-----
CreateWindowClass* pntWndClass; //Указатель на класс
//
 
LRESULT CALLBACK WndProc(HWND hWnd, UINT iMsg, WPARAM wParam, LPARAM lParam){
        HDC             hdc;
        PAINTSTRUCT     ps;
        RECT            rect;
        int             iNextString=0;
        int             x=0,y=0;
 
        switch(iMsg){
        case WM_CREATE:
            //PlaySound(L"ding.wav", NULL, SND_FILENAME|SND_SYNC);
        break;
        case WM_LBUTTONDOWN :
            x = LOWORD(lParam);
            y = HIWORD(lParam);
            if(x>=450 && x<=480 && y>=45 && y<=515)
            {
                for(int i=1; i<MAX_STAGE+1; i++)
                {
                    if(y>=520-(i*40)+5 && y<=520-(i*40)+35)
                    {
                        if(y<520-(i*40)+20)
                        {btns[i-1].CallBtn(UP);}
                        else {btns[i-1].CallBtn(DOWN);}
                        break;
                    }
                }
            }
        break;
        case WM_PAINT:
            cHouse.Draw();
            hdc=BeginPaint(hWnd, &ps);
 
            GetClientRect(hWnd, &rect);
 
            //TextOut(hdc, 600, y, "Hello", 5);
 
            EndPaint(hWnd, &ps);
        break;
        case WM_DESTROY:
            PostQuitMessage(0);
        break;
        default:
            return DefWindowProc(hWnd, iMsg, wParam, lParam);
        break;
        }
        return 0;
}
 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
    CreateWindowClass CrWind(hInstance, iCmdShow, TEXT("HelloWin32"), TEXT("Main Window"));
    pntWndClass=&CrWind;
    MSG         msg;
    
    //-----------
    if(!CrWind.RegMyWindowClass()) return 1;
    if(!CrWind.CrWindow()) return 2;
    //----------------------------------------------------------
    /*while(GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }*/
    while(TRUE)
    {
        if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
        {
            if (msg.message == WM_QUIT) break;
            TranslateMessage(&msg);
            DispatchMessage(&msg);
            }
        // Вывод очередного кадра игры
        GameMain();
    }
    return msg.wParam;
}

GameMain.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#if !GAMEMAINO
#define GAMEMAINO
//
#include <windows.h>
#include "CreateWindowClass.h"
#include "GameMain.h"
extern CreateWindowClass* pntWndClass; //Указатель на класс эта переменая используется как: pntWndClass.hwnd  В Draw()
 
class House
{
private:
    HBRUSH  hBrush;
    HDC     hdc;
    RECT    rect;
public:
    House()
    {
        SetRect(&rect, 10, 10, 500, 540);
        hBrush = CreateSolidBrush(RGB(189, 255, 178));
    }
    void Draw()
    {
    }
};
 
//extern Buttons btns[MAX_STAGE];
 
class Lift
{
private:
    HBRUSH  hBrush;
    HDC     hdc;
    RECT    rect;
    int     x;
    int     y;
    int     Stage;
    int     Active;
    int     KydaStage;
public:
    Lift(int red=100, int green=100, int blue=100): x(300), y(480), Stage(1), Active(NONE), KydaStage(1)
    {
        SetRect(&rect, x, y, x+30, y+40);
        hBrush = CreateSolidBrush(RGB(red, green, blue));
    }
    void MimoStage()//Мимо этого этажа пролетаю
    {
        if(Stage==KydaStage)
        {
            btns[Stage-1].LiftOver();
        }
    }
    void MoveLift()//Двигаем лифт
    {
    }
    void Draw()//Рисуем лифт
    {
    }
    void CallLift(int stg, int mode)//Лифт вызвала кнопка
    {
    }
};
 
class Buttons
{
private:
    HBRUSH  hBrush;
    HDC     hdc;
    RECT    rect;
    int     x;
    int     y;
    int     Active;
    int     MyStage;
    HBRUSH  AcBrush;
public:
    static int Stage;
    Buttons(): Active(NONE), MyStage(Stage)
    {
        x=450; y=520-(Stage*40)+5;
        SetRect(&rect, x, y, x+30, y+30);
        hBrush = CreateSolidBrush(RGB(30, 90, 50));
        AcBrush = CreateSolidBrush(RGB(78, 255, 34));
        Stage++;
    }
    void Draw()
    {
    }
    void CallBtn(int modeCall)
    {
        if(Active!=modeCall && Active!=UPDOWN)
        {
            switch(Active)
            {
            case NONE: 
                if((modeCall==DOWN && MyStage!=1)||(modeCall==UP && MyStage!=MAX_STAGE)) 
                    {Active=modeCall; cLt.CallLift(MyStage, Active);}
            break;
            case UP: case DOWN:   Active=UPDOWN;    cLt.CallLift(MyStage, Active);  break;
            }
        }
    }
    void LiftOver()
    {
    }
};
int Buttons::Stage=1;
 
//--Globals-Class
House cHouse;
Lift cLt;
Buttons btns[MAX_STAGE];
//-----------------------
void DrawAllBtn()
{
    for(int i=0; i<btns->Stage; i++)
    {
        btns[i].Draw();
    }
}
 
void GameMain()
{
    DWORD start_time = GetTickCount();
    //-------------------
    cHouse.Draw();
    cLt.Draw();
    DrawAllBtn();
 
    
    //-------------------
    while((GetTickCount() - start_time) < 66);
}
 
 
 
#endif

GameMain.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#if !GAMEMAIN
#define GAMEMAIN
//
#define MAX_STAGE 12
#define MAX_SPEED_LIFT 5
//
enum {NONE, UP, DOWN, UPDOWN};
 
class House;
class Lift;
class Buttons;
 
extern House    cHouse;
extern Lift     cLt;
extern Buttons  btns[MAX_STAGE];
 
void DrawAllBtn();
void GameMain();
 
#endif



Вот сами ошибки, но они просто несуразные...
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
createwindowclass.cpp(11) : error C4430: отсутствует спецификатор типа - предполагается int. Примечание. C++ не поддерживает int по умолчанию
createwindowclass.cpp(58) : error C2065: wndclass: необъявленный идентификатор
createwindowclass.cpp(58) : error C2228: выражение слева от ".lpfnWndProc" должно представлять класс, структуру или объединение
        тип: 'unknown-type'
createwindowclass.cpp(59) : error C2065: wndclass: необъявленный идентификатор
createwindowclass.cpp(59) : error C2228: выражение слева от ".style" должно представлять класс, структуру или объединение
        тип: 'unknown-type'
createwindowclass.cpp(60) : error C2065: wndclass: необъявленный идентификатор
createwindowclass.cpp(60) : error C2228: выражение слева от ".cbClsExtra" должно представлять класс, структуру или объединение
        тип: 'unknown-type'
createwindowclass.cpp(61) : error C2065: wndclass: необъявленный идентификатор
createwindowclass.cpp(61) : error C2228: выражение слева от ".cbWndExtra" должно представлять класс, структуру или объединение
        тип: 'unknown-type'
createwindowclass.cpp(62) : error C2065: wndclass: необъявленный идентификатор
createwindowclass.cpp(62) : error C2228: выражение слева от ".hInstance" должно представлять класс, структуру или объединение
        тип: 'unknown-type'
createwindowclass.cpp(63) : error C2065: wndclass: необъявленный идентификатор
createwindowclass.cpp(63) : error C2228: выражение слева от ".hIcon" должно представлять класс, структуру или объединение
        тип: 'unknown-type'
createwindowclass.cpp(64) : error C2065: wndclass: необъявленный идентификатор
createwindowclass.cpp(64) : error C2228: выражение слева от ".hCursor" должно представлять класс, структуру или объединение
        тип: 'unknown-type'
createwindowclass.cpp(65) : error C2065: wndclass: необъявленный идентификатор
createwindowclass.cpp(65) : error C2228: выражение слева от ".lpszMenuName" должно представлять класс, структуру или объединение
        тип: 'unknown-type'
createwindowclass.cpp(66) : error C2065: wndclass: необъявленный идентификатор
createwindowclass.cpp(66) : error C2228: выражение слева от ".lpszClassName" должно представлять класс, структуру или объединение
        тип: 'unknown-type'
createwindowclass.cpp(67) : error C2065: wndclass: необъявленный идентификатор
createwindowclass.cpp(67) : error C2228: выражение слева от ".hbrBackground" должно представлять класс, структуру или объединение
        тип: 'unknown-type'
createwindowclass.cpp(69) : error C2065: wndclass: необъявленный идентификатор
GameMain.cpp
GameMain.cpp(49) : error C2036: Buttons *: неизвестный размер
GameMain.cpp(49) : error C2027: использование неопределенного типа "Buttons"
        gamemain.h(11): см. объявление 'Buttons'
GameMain.cpp(49) : error C2228: выражение слева от ".LiftOver" должно представлять класс, структуру или объединение
main.cpp
main.cpp(36) : error C2036: Buttons *: неизвестный размер
main.cpp(36) : error C2027: использование неопределенного типа "Buttons"
        gamemain.h(11): см. объявление 'Buttons'
main.cpp(36) : error C2228: выражение слева от ".CallBtn" должно представлять класс, структуру или объединение
main.cpp(37) : error C2036: Buttons *: неизвестный размер
main.cpp(37) : error C2027: использование неопределенного типа "Buttons"
        gamemain.h(11): см. объявление 'Buttons'
main.cpp(37) : error C2228: выражение слева от ".CallBtn" должно представлять класс, структуру или объединение
main.cpp(44) : error C2027: использование неопределенного типа "House"
        gamemain.h(9): см. объявление 'House'
main.cpp(44) : error C2228: выражение слева от ".Draw" должно представлять класс, структуру или объединение
main.cpp(65) : error C2079: "CrWind" использует неопределенный class "CreateWindowClass"
main.cpp(65) : error C2078: слишком много инициализаторов
main.cpp(65) : error C2440: инициализация: невозможно преобразовать 'const char [12]' в 'int'
        Не существует контекста, в котором такое преобразование возможно
main.cpp(66) : error C2440: =: невозможно преобразовать 'int *' в 'CreateWindowClass *'
        Типы, на которые указывают указатели, не связаны; для преобразования требуется reinterpret_cast, приведение в стиле С или приведение в стиле функции
main.cpp(70) : error C2228: выражение слева от ".RegMyWindowClass" должно представлять класс, структуру или объединение
        тип: int
main.cpp(71) : error C2228: выражение слева от ".CrWindow" должно представлять класс, структуру или объединение
        тип: int


Подскажите в чем проблема?
P.S. Как только все пихаю в 1 файл, то все становится нормально!

Добавлено через 27 минут
Есть еще одна проблема:
Видно я еще и неправильно объявляю классы Buttons и Lift между собой, так как обоим классам нужен доступ к друг-другу.(Buttons класс кнопок ВНЕ лифта, поэтому объединять их нету смысла)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 11:57. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru