把一个类实现串行化,遇到无法解析的外部符号

jtqjz2 2017-11-27 04:16:28
把类CGraph串行化:头文件为:
#pragma once
class CGraph:public CObject
{
DECLARE_SERIAL(CGraph)
public:
CGraph();
void Serialize(CArchive&ar);
void Draw(CDC*pDC);
~CGraph();
CGraph(UINT m_nDrawType, CPoint m_ptOrigin, CPoint m_ptEnd);
unsigned int m_nDrawType;
CPoint m_ptOrigin;
CPoint m_ptEnd;
unsigned int m_nLineWidth;
};
源文件为:
#include "stdafx.h"
#include "Graph.h"
IMPLEMENT_SERIAL(CGraph,CObject,1)
CGraph::CGraph(UINT m_nDrawType, CPoint m_ptOrigin, CPoint m_ptEnd)
{
this->m_nDrawType = m_nDrawType;
this->m_ptOrigin = m_ptOrigin;
this->m_ptEnd = m_ptEnd;
}
CGraph::CGraph()
{
m_nDrawType = 0;
m_nLineWidth = 0;
}
void CGraph::Serialize(CArchive&ar)
{
if (ar.IsStoring())
{
ar << m_nDrawType << m_ptOrigin << m_ptEnd;
}
else
{
ar>> m_nDrawType >> m_ptOrigin >> m_ptEnd;
}
}

结果出错原因为:
错误 1 error LNK2019: 无法解析的外部符号 "public: __thiscall CObject::CObject(void)" (??0CObject@@QAE@XZ),该符号在函数 "public: __thiscall CGraph::CGraph(unsigned int,class CPoint,class CPoint)" 被引用

这到底是哪错了!!?
感谢各位大佬!!
...全文
493 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
sds123go 2017-11-29
  • 打赏
  • 举报
回复
你这个问题我遇到过,大致意思是函数体没找到,建议你换个编译器,VS2015或者换台电脑试试!!
schlafenhamster 2017-11-28
  • 打赏
  • 举报
回复
你把 CGraph::CGraph() { m_nDrawType = 0; m_nLineWidth = 0; } 注释搞看看 Linking... Graph.obj : error LNK2001: unresolved external symbol "public: __thiscall CGraph::CGraph(void)" (??0CGraph@@QAE@XZ) .\Release/collect.exe : fatal error LNK1120: 1 unresolved externals
jtqjz2 2017-11-28
  • 打赏
  • 举报
回复
引用 14 楼 schlafenhamster 的回复:
CObject 定义中 virtual ~CObject(); // virtual destructors are necessary
如果是析构函数的问题,那这个析构函数里面要怎么写?而且注释掉以后显示的还是 :错误 1 error LNK2019: 无法解析的外部符号 "public: __thiscall CObject::CObject(void)" (??0CObject@@QAE@XZ),该符号在函数 "public: __thiscall CGraph::CGraph(unsigned int,class CPoint,class CPoint)" (??0CGraph@@QAE@IVCPoint@@0@Z) 中被引用 谢谢了
schlafenhamster 2017-11-28
  • 打赏
  • 举报
回复
CObject 定义中 virtual ~CObject(); // virtual destructors are necessary
schlafenhamster 2017-11-28
  • 打赏
  • 举报
回复
注释掉 试试! Linking... Graph.obj : error LNK2001: unresolved external symbol "public: virtual __thiscall CGraph::~CGraph(void)" (??1CGraph@@UAE@XZ) .\Release/collect.exe : fatal error LNK1120: 1 unresolved externals
jtqjz2 2017-11-28
  • 打赏
  • 举报
回复
引用 11 楼 schlafenhamster 的回复:

// Graph.h : header file
class CGraph : public CObject
{
	DECLARE_SERIAL(CGraph)
public:
	CGraph();
	CGraph(UINT m_nDrawType, CPoint m_ptOrigin, CPoint m_ptEnd);
	void Draw(CDC*pDC);
// Attributes
public:
	unsigned int m_nDrawType;
	CPoint m_ptOrigin;
	CPoint m_ptEnd;
	unsigned int m_nLineWidth;
// Operations
public:
// Implementation
public:
	virtual ~CGraph();
	virtual void Serialize(CArchive& ar);
};
////////////////////////////////////////////
// Graph.cpp
IMPLEMENT_SERIAL(CGraph,CObject,1)

CGraph::CGraph()
{
	m_nDrawType = 0;
	m_nLineWidth = 0;
}

CGraph::CGraph(UINT nDrawType, CPoint ptOrigin, CPoint ptEnd)
{
	m_nDrawType = nDrawType;
	m_ptOrigin = ptOrigin;
	m_ptEnd = ptEnd;
}

CGraph::~CGraph()
{

}

void CGraph::Serialize(CArchive &ar)
{
	if (ar.IsStoring())
	{
		ar << m_nDrawType << m_ptOrigin << m_ptEnd;
	}
	else
	{
		ar>> m_nDrawType >> m_ptOrigin >> m_ptEnd;
	}
}
缺: CGraph::~CGraph() { }
大佬,上面39行处的析构函数不写明实现函数应该没太大影响吧,不是有默认的析构吗?方不方便解释一下,谢谢!
schlafenhamster 2017-11-28
  • 打赏
  • 举报
回复

// Graph.h : header file
class CGraph : public CObject
{
	DECLARE_SERIAL(CGraph)
public:
	CGraph();
	CGraph(UINT m_nDrawType, CPoint m_ptOrigin, CPoint m_ptEnd);
	void Draw(CDC*pDC);
// Attributes
public:
	unsigned int m_nDrawType;
	CPoint m_ptOrigin;
	CPoint m_ptEnd;
	unsigned int m_nLineWidth;
// Operations
public:
// Implementation
public:
	virtual ~CGraph();
	virtual void Serialize(CArchive& ar);
};
////////////////////////////////////////////
// Graph.cpp
IMPLEMENT_SERIAL(CGraph,CObject,1)

CGraph::CGraph()
{
	m_nDrawType = 0;
	m_nLineWidth = 0;
}

CGraph::CGraph(UINT nDrawType, CPoint ptOrigin, CPoint ptEnd)
{
	m_nDrawType = nDrawType;
	m_ptOrigin = ptOrigin;
	m_ptEnd = ptEnd;
}

CGraph::~CGraph()
{

}

void CGraph::Serialize(CArchive &ar)
{
	if (ar.IsStoring())
	{
		ar << m_nDrawType << m_ptOrigin << m_ptEnd;
	}
	else
	{
		ar>> m_nDrawType >> m_ptOrigin >> m_ptEnd;
	}
}
缺: CGraph::~CGraph() { }
jtqjz2 2017-11-28
  • 打赏
  • 举报
回复
引用 9 楼 zgl7903 的回复:
用向导生成一个MFC程序,然后再测试你的代码试试看 可能缺少相应的头文件或库文件
您好,经测试加上public CObject 后还是出现类似错误,按您说的应该是缺少哪个库文件呢?谢谢!
zgl7903 2017-11-28
  • 打赏
  • 举报
回复
用向导生成一个MFC程序,然后再测试你的代码试试看 可能缺少相应的头文件或库文件
schlafenhamster 2017-11-28
  • 打赏
  • 举报
回复
叫你 比较 vc6 的 和 你的 有什么不同
jtqjz2 2017-11-28
  • 打赏
  • 举报
回复
看不出来
schlafenhamster 2017-11-28
  • 打赏
  • 举报
回复
我把 vc6 上的 定义 给你 看看 有什么 不同。

/////////////////////////////////////////////////////////////////////////////
// class CObject is the root of all compliant objects

#ifdef _AFXDLL
class CObject
#else
class AFX_NOVTABLE CObject
#endif
{
public:

// Object model (types, destruction, allocation)
	virtual CRuntimeClass* GetRuntimeClass() const;
	virtual ~CObject();  // virtual destructors are necessary

	// Diagnostic allocations
	void* PASCAL operator new(size_t nSize);
	void* PASCAL operator new(size_t, void* p);
	void PASCAL operator delete(void* p);
#if _MSC_VER >= 1200
	void PASCAL operator delete(void* p, void* pPlace);
#endif

#if defined(_DEBUG) && !defined(_AFX_NO_DEBUG_CRT)
	// for file name/line number tracking using DEBUG_NEW
	void* PASCAL operator new(size_t nSize, LPCSTR lpszFileName, int nLine);
#if _MSC_VER >= 1200
	void PASCAL operator delete(void *p, LPCSTR lpszFileName, int nLine);
#endif
#endif

	// Disable the copy constructor and assignment by default so you will get
	//   compiler errors instead of unexpected behaviour if you pass objects
	//   by value or assign objects.
protected:
	CObject();
private:
	CObject(const CObject& objectSrc);              // no implementation
	void operator=(const CObject& objectSrc);       // no implementation

// Attributes
public:
	BOOL IsSerializable() const;
	BOOL IsKindOf(const CRuntimeClass* pClass) const;

// Overridables
	virtual void Serialize(CArchive& ar);

#if defined(_DEBUG) || defined(_AFXDLL)
	// Diagnostic Support
	virtual void AssertValid() const;
	virtual void Dump(CDumpContext& dc) const;
#endif

// Implementation
public:
	static const AFX_DATA CRuntimeClass classCObject;
#ifdef _AFXDLL
	static CRuntimeClass* PASCAL _GetBaseClass();
#endif
};
jtqjz2 2017-11-28
  • 打赏
  • 举报
回复
引用 16 楼 schlafenhamster 的回复:
你把 CGraph::CGraph() { m_nDrawType = 0; m_nLineWidth = 0; } 注释搞看看 Linking... Graph.obj : error LNK2001: unresolved external symbol "public: __thiscall CGraph::CGraph(void)" (??0CGraph@@QAE@XZ) .\Release/collect.exe : fatal error LNK1120: 1 unresolved externals
你好,现在的问题是新建一个新的类,只要是基于CObject就出现这个错误,不知道咋解决,头大
sparrowtj 2017-11-27
  • 打赏
  • 举报
回复
引用 7 楼 jtqjz2 的回复:
[quote=引用 2 楼 sparrowtj 的回复:] CObject类没有共有或保护的默认构造函数(默认构造函数就是没有输入参数的构造函数)可供调用。 你应该在CGraph的构造函数的初始化列表中显示调用CObject的构造函数。
在CGraph不是定义了一个默认构造函数来隐式调用基类默认构造函数了吗?为什么还要显示的调用? 又该怎么调用,求大佬告知?[/quote] 我没看你那个CObject的定义哈,我以为是你的CObject没有默认的构造函数了,出错信息显示是找不到函数的实现。所以要不是没有默认构造函数,要不是是有默认构造函数,但是CObject包含的代码没有被正确链接(可能的原因是动态库或静态库没链接)
jtqjz2 2017-11-27
  • 打赏
  • 举报
回复
引用 2 楼 sparrowtj 的回复:
CObject类没有共有或保护的默认构造函数(默认构造函数就是没有输入参数的构造函数)可供调用。 你应该在CGraph的构造函数的初始化列表中显示调用CObject的构造函数。
在CGraph不是定义了一个默认构造函数来隐式调用基类默认构造函数了吗?为什么还要显示的调用? 又该怎么调用,求大佬告知?
jtqjz2 2017-11-27
  • 打赏
  • 举报
回复
引用 5 楼 jason_wentzel 的回复:
另外析构函数没实现
按您说的做了,还是不行啊!
孤客天涯 2017-11-27
  • 打赏
  • 举报
回复
另外析构函数没实现
孤客天涯 2017-11-27
  • 打赏
  • 举报
回复
形参与成员变量重名了 CGraph::CGraph(UINT m_nDrawType, CPoint m_ptOrigin, CPoint m_ptEnd) { this->m_nDrawType = m_nDrawType; this->m_ptOrigin = m_ptOrigin; this->m_ptEnd = m_ptEnd; } 改成 CGraph::CGraph(UINT nDrawType, CPoint ptOrigin, CPoint ptEnd) { this->m_nDrawType = nDrawType; this->m_ptOrigin = ptOrigin; this->m_ptEnd = ptEnd; }
schlafenhamster 2017-11-27
  • 打赏
  • 举报
回复
查看 “CObject” 定义 有 : // Disable the copy constructor and assignment by default so you will get // compiler errors instead of unexpected behaviour if you pass objects // by value or assign objects. protected: CObject(); private: CObject(const CObject& objectSrc); // no implementation void operator=(const CObject& objectSrc); // no implementation
sparrowtj 2017-11-27
  • 打赏
  • 举报
回复
CObject类没有共有或保护的默认构造函数(默认构造函数就是没有输入参数的构造函数)可供调用。 你应该在CGraph的构造函数的初始化列表中显示调用CObject的构造函数。
加载更多回复(1)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧