将自己的C ++类添加到现有的MFC应用程序中

时间:2016-03-14 13:14:25

标签: c++ class mfc include

这是我之前提出的问题的后续行动,但提供的答案会导致新的问题。我有自己的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

2 个答案:

答案 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()
{
}

这是设置课程的正确方法。