gpt4 book ai didi

c++ - 无缘无故的多重析构函数定义

转载 作者:行者123 更新时间:2023-11-30 03:50:10 25 4
gpt4 key购买 nike

我有一个项目要从 VC6 迁移到 VS2013。在构建项目时,出现此错误。

error LNK2005: "public: virtual __thiscall CMemDC::~CMemDC(void)" (??1CMemDC@@UAE@XZ) already defined in 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头文件

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

此问题与一个定义规则相关,该规则定义为 here ,但我不知道该怎么做。

我做了一些修改建议here .现在我遇到了以下错误。有什么想法吗?

error LNK1181: cannot open input file 'Nafxcwd.lib Libcmtd.lib'

最佳答案

好吧,终于按照设置帮助我解决了这个问题..

  1. Project properties->linker->input->ignore specific default library ..设置为.. nafxcw.lib libcmt.lib
  2. 项目属性->c/c++->代码生成->运行时库 ..设置为.. 多线程DLL(/MD)
  3. Project properties->configuration properties->general->Use of MFC .. set to .. use of MFC in a shared DLL.

除了这些设置之外,我没有更改任何代码(w.r.t. 包括守卫等)

关于c++ - 无缘无故的多重析构函数定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32008808/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com