2016-03-11 4 views
0

Я новичок в этом программировании. Хотя я думал, что понял основную идею классов и в том числе, я не могу понять, что я делаю неправильно здесь. Я сделал свой собственный класс с именем сетки, которая выглядит следующим образом:Класс не доступен, несмотря на включение

--- Grid.h --- 

class Grid{ 

public: 

Grid(HWND wnd); 

public: 

void paint(CDC &dc, int sqr, bool axis);   //paint the grid 
void tag(CDC &dc); 

private: 
    int square;          //square size 
    CRect frame;         //client area size 
}; 


--- Grid.cpp --- 

#include "stdafx.h" 
#include "Grid.h" 


Grid::Grid(HWND wnd) 
    { 
    CRect rect; 
    GetClientRect(wnd, &rect);     // get client area size 
    frame.left = rect.right/2 - 387;   // fit frame to margin 
    frame.right = frame.left + 774; 
    frame.top = rect.bottom - 874; 
    frame.bottom = rect.bottom - 100; 

} 

void Grid::paint(CDC &dc, int sqr, bool axis){ 

square = sqr;        // paint grid 
CPen penWhite; 
penWhite.CreatePen(PS_SOLID, 1, RGB(255, 255, 255)); 
dc.SelectObject(&penWhite); 
dc.Rectangle(frame); 

dc.MoveTo(frame.left + square, frame.top); 
for (int i = 1; i < 18; i++){ 
    dc.LineTo(frame.left + square * i, frame.bottom); 
    dc.MoveTo(frame.left + square + square * i, frame.top); 
} 

dc.MoveTo(frame.left, frame.top + square); 
for (int i = 1; i < 18; i++){ 
    dc.LineTo(frame.right, frame.top + square * i); 
    dc.MoveTo(frame.left, frame.top + square + square * i); 
} 

[...] 

Теперь, что я пытаюсь сделать, это добавить объект этого класса из другого класса. Как вы могли догадаться, это приложение MFC, которое должно использовать функциональность, которую я предоставляю Grid. Поэтому я добавил

--- MainFrm.cpp --- 

[...] 

// CMainFrame construction/destruction 


CMainFrame::CMainFrame() 
{ 
    // TODO: add member initialization code here 
    Grid theGrid{ GetSafeHwnd() }; 
} 

CMainFrame::~CMainFrame() 
{ 
} 

[...] 

, в котором я позже позвонить:

void CMainFrame::OnPaint() 
{ 
CPaintDC dc(this); // get device context for paint 

// get current window size 
CRect rect; 
GetClientRect(&rect); // get current client area size 

// fill background black 
CBrush brushBlack; 
brushBlack.CreateSolidBrush(RGB(0, 0, 0)); 
dc.SelectObject(&brushBlack); 
dc.FillRect(rect, &brushBlack); 

// paint grid 
theGrid.paint(dc, 43, 1); 
ReleaseDC(&dc); 

} // end OnPaint() 

... но компилятор дает мне ошибку C2065: 'theGrid': необъявленный идентификатор в то время как Intellisense лает на theGrid.paint (dc, 43, 1);

Что я здесь делаю неправильно? Мне просто нужен объект Grid, созданный из MainFrm, доступ к которому имеет каждая функция.

С наилучшими пожеланиями, Michen

+1

вы также должны включать в себя заголовок в MainFrm.cpp – user463035818

+0

** # включить «Grid.h» ** в начале MainFrm .cpp – Harry

+0

Я уже это сделал, но забыл упомянуть. – Michen

ответ

0

Include Grid.h в вас CMainFrame.h файл и определить theGrid как переменную в CMainFrame

в mainfrm.h

#include "Grid.h" 
... 
class CMainFrame 
{ 
.... 
    Grid theGrid; 
... 
}; 

I MainFrm.cpp

#inlcude "MainFrm.h" 
... 
CMainFrame::CMainFrame() : theGrid(GetSafeHwnd()) 
{ 
    // TODO: add member initialization code here 
} 
+0

Я слежу за этим, но если я правильно понимаю, это технически то же самое решение, что и Chexxor, ниже, не так ли? – Michen

+0

Да, это то же самое решение. – thorsan

1
Grid theGrid{ GetSafeHwnd() }; 

объявляется внутри конструктора и, таким образом, получает только локальную область видимости. Вы должны объявить его вне конструктора и инициализировать его в конструкторе, как:

--.h file-- 
public class CMainFrame{ 
    Grid theGrid; 

    [...] 

--.cpp file--- 
CMainFrame::CMainFrame() : 
    theGrid(GetSafeHwnd()) 
{} 
+0

Хорошо, но когда я Grid theGrid; он говорит, что нет конструктора по умолчанию. Когда я добавляю один в Grid.h как Grid(); Я получаю сообщение об ошибке; ожидается в CMainFrame :: CMainFrame() theGrid (GetSafeHwnd()) сразу после Grid. – Michen

+0

Я только что заметил, что забыл: после конструктора, и теперь я его отредактировал, это причина? – Chexxor

+0

сделал это, но потом; а не: – Michen