inherit class with virtual members from static library

Started by
1 comment, last by ac3 14 years, 10 months ago
I have just started with my first attempt at a game engine and I have a problem. I was looking for the best way to separate the engine from the game code and decided to use a static library (.lib file) and that works great except one thing.. I don't seem to be able to make a class in my game project inherit a class with virtual members in my engine project. The game project is linked to the engine project correctly and I can use it for everything except inheriting a class with virtual members. The specific thing I'm doing now is a win32 window wrapper class which is a base class in the engine that each real window in the game will inherit. The virtual method is the wndproc that needs to be different for each window. > error LNK2001: unresolved external symbol "public: virtual long __stdcall WndMain::wndproc(struct HWND__ *,unsigned int,unsigned int,long)" (?wndproc@WndMain@@UAGJPAUHWND__@@IIJ@Z) > fatal error LNK1120: 1 unresolved externals I get this ^^^^^^ note that there are two wndproc methods (stwndproc which is static and is no problem and then there wndproc which is virtual) basewindow.h (part of engine static library)
class BaseWindow
{
private:
	HINSTANCE inst;
	HWND wnd;
	WNDCLASSEX wc;
	char cn[256], t[256];
protected:
	BaseWindow(HINSTANCE hInstance);
	~BaseWindow();
public:
	static LRESULT CALLBACK stwndproc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
	virtual LRESULT CALLBACK wndproc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
	void create();
	void destroy();
// etc
};
basewindow.cpp (part of engine static library)
BaseWindow::BaseWindow(HINSTANCE hInstance)
{
	inst = hInstance;
	strcpy(cn, "default");
	strcpy(t, "untitled");

	wc.cbSize = sizeof(WNDCLASSEX);
	wc.style = CS_HREDRAW | CS_VREDRAW;
	wc.lpfnWndProc = BaseWindow::stwndproc;
	wc.cbClsExtra = 0;
	wc.cbWndExtra = 0;
	wc.hInstance = inst;
	wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
	wc.hCursor = LoadCursor(NULL, IDC_ARROW);
	wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
	wc.lpszMenuName = 0;
	wc.lpszClassName = cn;
	wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
}

BaseWindow::~BaseWindow()
{
}

LRESULT CALLBACK BaseWindow::stwndproc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
// irrelevant
}

LRESULT CALLBACK BaseWindow::wndproc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	return DefWindowProc(hWnd, uMsg, wParam, lParam);
}

void Window::create()
{
// irrelevant
}

void Window::destroy()
{
// irrelevant
}
wndmain.h (part of game code)
class WndMain : public BaseWindow
{
public:
	WndMain(HINSTANCE hInstance);
	~WndMain();
	LRESULT CALLBACK wndproc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
};
wndmain.cpp (part of game code)
WndMain::WndMain(HINSTANCE hInstance) : BaseWindow(hInstance)
{
// irrelevant
}

WndMain::~WndMain()
{
// irrelevant
}

LRESULT CALLBACK wndproc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
// irrelevant
}
Does anyone know why this is? I have never used a static library before so maybe the limitation is there?
Advertisement
You forgot to put class name (WndMain::) before wndproc in wndmain.cpp file.
2 days of headache trying to figure it out testing different things... what was needed was new eyes looking at it. thank you very much!

This topic is closed to new replies.

Advertisement