如何使用继承并避免LNK2019错误

时间:2016-06-06 20:46:43

标签: c++ inheritance

在多个文件中使用继承的正确方法是什么?

我是C ++的新手,我正在尝试为我所有的GDI +相关函数创建一个类,我将在单独的cpp文件中使用它。我尝试了几种方法,并且能够更容易地找到问题,我尝试使用空构造函数。

我用这段代码得到了LNK2019(我拿走了与问题无关的部分,只留下了与WndFuncs类相关的内容):

函数文件头:

#ifndef WNDFUNCS_H
#define WNDFUNCS_H

class WndFuncs
{
private:
public:
    WndFuncs(); //declaration
};

#endif

文件本身:

#include "stdafx.h"

#include <windows.h>
#include <commctrl.h>
#include <winuser.h>
#include <gdiplus.h>
#include "WndFuncs.h"

WndFuncs::WndFuncs() //definition
{

}

尝试继承该类的类的标题:

#ifndef SEARCHEDITBOX_H
#define SEARCHEDITBOX_H

class SearchEditBox : public WndFuncs
{
private:
    WndFuncs b;
    SearchEditBox();

public:
    ~SearchEditBox();
    static SearchEditBox* CreateEditBox(HINSTANCE hInst, HWND hwnd, int pos_x, int pos_y, int width, int height, WndCols const* p_wndCols);

#endif

班级档案:

#include "stdafx.h"
#include "WndCols.h"

#include <windows.h>
#include "WndFuncs.h"
#include "SearchEditBox.h"

SearchEditBox::SearchEditBox()
    : b()
{

}

SearchEditBox::~SearchEditBox()
{
    if (editBox)
        DestroyWindow(editBox);
}

SearchEditBox* SearchEditBox::CreateEditBox(HINSTANCE hInst, HWND hwnd, int pos_x, int pos_y, int width, int height, WndCols const* p_wndCols)
{
    SearchEditBox *p_SearchEditBox = new SearchEditBox; //allocating dynamic memory for class (which by itself is declared as pointer)
    return p_SearchEditBox;
}

错误是:

  

LNK2019未解析的外部符号&#34; public:__ thishisall   WndFuncs :: WndFuncs(无效)&#34; (?? 0WndFuncs @@ QAE @ XZ)在函数中引用   &#34; private:__ thiscall SearchEditBox :: SearchEditBox(void)&#34;   (?? 0SearchEditBox @@ @ AAE XZ)

我已经阅读了MSDN page上的解释和所有要点(甚至尝试将&#34; __ cdecl&#34;放入函数声明中),我确信该函数已声明并定义(在类中)文件;我也试过const int x认为问题可能在空构造函数中),所以WndFuncs文件应该没问题。

我已阅读this,我的假设是我在继承文件中以错误的方式声明了类(并且链接器因此无法链接到WndFuncs类中的正确函数),但即使我正试图按照here中的描述做所有事情,但它也无济于事。我没有使用任何虚拟成员,因此问题不应与此相关(如该页面所指出的那样)。

当我向WndFuncs类添加析构函数时,我得到2个LNK2019错误,所以问题也不应该与之相关。我也有正确的头文件我认为(试过两个)。

我也尝试过使用其他函数(有或没有构造函数)同样的错误。

1 个答案:

答案 0 :(得分:0)

通过以正确的方式将类文件添加到项目中来解决问题:项目&gt;添加课程。之后,引用被正确链接。

我做错了是单独向项目添加文件(通过:文件&gt;添加&gt;文件)。