无缘无故地定义多个析构函数
Multiple destructor definition for no reason
我有一个项目,我从VC6迁移到VS2013。当我在构建项目时,我得到了这个错误。
error LNK2005: "public: virtual __thiscall CMemDC::~CMemDC(void)"(??1CMemDC@@UAE@XZ)已经在GameBoard.obj中定义
以下是可能导致此问题的文件。
GameBoard.h
#include "DirectSound.h"
#include "MIDI.h"
#include <vector>
class CGameBoard : public CWnd
{
friend class CTetrisDlg;
friend class COptionsDlg;
DECLARE_DYNAMIC(CGameBoard);
// Construction/Destruction
public:
CGameBoard();
virtual ~CGameBoard();
.......
};
GameBoard.cpp文件有这个析构函数的定义。
#include "stdafx.h"
#include "Tetris.h"
#include "GameBoard.h"
#include "Piece.h"
#include "MemDC.h"
#include "VolumeCtrl.h"
#include <stdlib.h>
#include <time.h>
static CGameBoard * gpGameBoard;
CGameBoard::CGameBoard()
{
m_pCurPiece = m_pNextPiece = 0;
m_usLevel = 0;
m_clrCurPiece = RGB(0,0,0);
m_bShowGrid = TRUE;
m_nSquareWidth = 14;
m_nSquareHeight = 14;
m_clrBackground = RGB(255, 255, 255);
m_bExFigures = FALSE;
m_pMusic = 0;
m_uTimer = 0;
m_dwVolume = 100; // 100% music volume by default
gpGameBoard = this;
}
CGameBoard::~CGameBoard()
{
if(m_pCurPiece)
delete m_pCurPiece;
if(m_pNextPiece)
delete m_pNextPiece;
if( m_pMusic )
delete m_pMusic;
gpGameBoard = 0;
}
此析构函数仅在GameBoard.cpp
中定义一次,GameBoard
不包含在任何其他cpp
或header file
中。
MemDC.h
#ifndef _MEMDC_H_
#define _MEMDC_H_
class CMemDC : public CDC {
private:
CBitmap m_bitmap; // Offscreen bitmap
CBitmap* m_oldBitmap; // bitmap originally found in CMemDC
CDC* m_pDC; // Saves CDC passed in constructor
CRect m_rect; // Rectangle of drawing area.
BOOL m_bMemDC; // TRUE if CDC really is a Memory DC.
public:
CMemDC(CDC* pDC) : CDC(), m_oldBitmap(NULL), m_pDC(pDC)
{
ASSERT(m_pDC != NULL); // If you asserted here, you passed in a NULL CDC.
m_bMemDC = !pDC->IsPrinting();
if (m_bMemDC){
// Create a Memory DC
CreateCompatibleDC(pDC);
pDC->GetClipBox(&m_rect);
m_bitmap.CreateCompatibleBitmap(pDC, m_rect.Width(), m_rect.Height());
m_oldBitmap = SelectObject(&m_bitmap);
SetWindowOrg(m_rect.left, m_rect.top);
} else {
// Make a copy of the relevent parts of the current DC for printing
m_bPrinting = pDC->m_bPrinting;
m_hDC = pDC->m_hDC;
m_hAttribDC = pDC->m_hAttribDC;
}
}
~CMemDC()
{
if (m_bMemDC) {
// Copy the offscreen bitmap onto the screen.
m_pDC->BitBlt(m_rect.left, m_rect.top, m_rect.Width(), m_rect.Height(),
this, m_rect.left, m_rect.top, SRCCOPY);
//Swap back the original bitmap.
SelectObject(m_oldBitmap);
} else {
// All we need to do is replace the DC with an illegal value,
// this keeps us from accidently deleting the handles associated with
// the CDC that was passed to the constructor.
m_hDC = m_hAttribDC = NULL;
}
}
// Allow usage as a pointer
CMemDC* operator->() {return this;}
// Allow usage as a pointer
operator CMemDC*() {return this;}
};
#endif
这个问题与这里定义的一个定义规则有关,但我不知道该怎么做。
我已经做了这里建议的一些更改。现在我得到了下面的错误。有什么主意吗?
错误LNK1181:不能打开输入文件"Nafxcwd"。自由Libcmtd.lib '
最后以下设置帮助我解决了这个问题。
-
Project properties->linker->input->ignore specific default library
..设置为…nafxcw.lib libcmt.lib
-
Project properties->c/c++->Code generation->run time library
..设置为…Multi threaded DLL (/MD)
-
Project properties->configuration properties->general->Use of MFC
..设置为…use of MFC in a shared DLL
。
除了这些设置之外,我没有在代码中更改任何内容(例如包括守护符等)
您没有提供完整的代码。但总的来说,你的代码似乎缺少标题保护。这些是必要的,如果没有它们,你很可能会遇到像你这样的链接器问题。
在windows上,在所有头文件的顶部添加这一行:
#pragma once
一般来说,你可以在所有的编译器中使用传统的头保护符
#ifndef HEADERNAME_H
#define HEADERNAME_H
//Put content of header file here
#endif
我最近在一些旧代码中遇到了同样的问题。我认为奇怪的是,我也看到了在我的代码中定义的一个名为CMemDC的类的错误。我将类重命名为CMemJBDC,错误消失了。
相关文章:
- 添加自定义析构函数时,Move 构造函数在派生类中消失
- 如何正确定义C++类析构函数并将其链接到主文件?
- 仅在 MacOS 上析构函数的未定义符号
- 即使基类和派生类只使用基元数据类型,我是否需要定义虚拟析构函数
- 对已定义的接口析构函数的未定义引用
- 对 clang 中析构函数的未定义引用
- 在从仅移动类型派生的类中定义析构函数在使用 std::vector emplace_back或push_back创建时会
- 为什么这个自定义分配器的析构函数在 GCC/MSVS 的 stdlib 中被调用两次
- 使用自定义工具集获取动态退出析构函数链接错误 - eh 矢量析构函数
- 为什么在定义析构函数时隐式删除移动构造函数
- DIRECTX9 中自定义顶点的虚拟析构函数
- 编译器定义的移动构造函数与析构函数
- 我可以解决unique_ptr在<MyType>仅存储 nullptr 时不需要 MyType 析构函数定义吗?
- 为什么复制构造函数不是微不足道的,因为有一个用户定义的析构函数?
- 仅在删除包含对象的向量时调用自定义»析构函数«
- 这个递归类需要一个自定义析构函数?
- 如果基类析构函数是虚拟的,是否需要派生类析构函数定义
- 添加析构函数定义将创建运行异常
- 类内部的纯虚析构函数定义会导致编译错误
- c++虚析构函数定义