这是我之前提出的问题的后续行动,但提供的答案会导致新的问题。我有自己的Grid类,如下所示:
class Grid{
public:
Grid(HWND wnd);
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
};
和
#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;
}
[...]
现在我想将它们包含在MFC应用程序向导给出的CMainFrame类中,这就是我在MainFrm.h中添加以下内容的原因:
#pragma once
#include "ChildView.h"
#include "Grid.h"
class CMainFrame : public CFrameWnd
{
[...]
Grid myGrid(HWND wnd = NULL);
[...]
}
然后在MainFrm.cpp中添加:
#include "stdafx.h"
#include "GridTargets.h"
#include "MainFrm.h"
#include "Grid.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CMainFrame construction/destruction
Grid myGrid;
CMainFrame::CMainFrame() : myGrid(GetSafeHwnd())
{}
CMainFrame::~CMainFrame()
{
}
[...]
但是编译器给出了一些关于MainFrame.cpp的错误,它们是:
Error 3 error C2600: 'CMainFrame::CMainFrame' : cannot define a compiler-generated special member function (must be declared in the class first) c:\users\michen\documents\repos\gridtargets\gridtargets\mainfrm.cpp 31 1 GridTargets
Error 4 error C2436: 'myGrid' : member function or nested class in constructor initializer list c:\users\michen\documents\repos\gridtargets\gridtargets\mainfrm.cpp 32 1 GridTargets
Error 5 error C2228: left of '.paint' must have class/struct/union c:\users\michen\documents\repos\gridtargets\gridtargets\mainfrm.cpp 142 1 GridTargets
Error 2 error C2079: 'myGrid' uses undefined class 'Grid' c:\users\michen\documents\repos\gridtargets\gridtargets\mainfrm.cpp 29 1 GridTargets
Error 1 error C2011: 'Grid' : 'class' type redefinition c:\users\michen\documents\repos\gridtargets\gridtargets\grid.h 1 1 GridTargets
有人可以告诉我哪里出错了吗?
此致 Michen
答案 0 :(得分:1)
我必须猜测一下,没有剩下的代码,但至少有一些错误应该是明确的:
错误3错误C2600:' CMainFrame :: CMainFrame' :无法定义编译器生成的特殊成员函数(必须先在类中声明)c:\ users \ michen \ documents \ repos \ gridtargets \ gridtargets \ mainfrm.cpp 31 1 GridTargets
这是因为你没有在" CMainFrame"中声明构造函数。 C ++为您插入构造函数,但也是一个实现。
错误4错误C2436:' myGrid' :构造函数初始化程序列表中的成员函数或嵌套类c:\ users \ michen \ documents \ repos \ gridtargets \ gridtargets \ mainfrm.cpp 32 1 GridTargets
我不确定...但我相信这也是因为你没有定义构造函数,也无法初始化成员变量。
错误5错误C2228:左边的' .paint'必须有class / struct / union c:\ users \ michen \ documents \ repos \ gridtargets \ gridtargets \ mainfrm.cpp 142 1 GridTargets
我必须看到相应的代码。
错误2错误C2079:' myGrid'使用未定义的类'网格' c:\ users \ michen \ documents \ repos \ gridtargets \ gridtargets \ mainfrm.cpp 29 1 GridTargets
你可能忘了包含" Grid.h"?
错误1错误C2011:'网格' :' class'类型重定义c:\ users \ michen \ documents \ repos \ gridtargets \ gridtargets \ grid.h 1 1 GridTargets
这看起来像你缺少代码守卫。位:
#ifndef GRID_H
#define GRID_H
[...]
#endif
在你的Grid.h文件中。
答案 1 :(得分:1)
正确。您需要在网格头文件中设置构造函数默认值。这是你把HWND = null的地方。在网格构造函数定义中。
所以,你的标题:
#pragma once
class Grid
{
public:
// A default constructor must provide a default value for all of it's parameters (if it has any)
Grid(HWND hWhatever = NULL);
~Grid();
private:
HWND m_hWhatever;
};
您的来源:
#include "stdafx.h"
#include "Grid.h"
Grid::Grid(HWND hWhatever /*NULL*/)
: m_hWhatever(hWhatever)
{
}
Grid::~Grid()
{
}
这是设置课程的正确方法。