游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1546|回复: 1

请问:关于 DLL、Singleton 和 STL 的问题,谢谢!

[复制链接]

17

主题

41

帖子

45

积分

注册会员

Rank: 2

积分
45
QQ
发表于 2005-12-16 16:32:00 | 显示全部楼层 |阅读模式
1、新建一个DLL工程,里面有两个类:ResManager 和 Singleton

// Singleton.h
template <typename T> class Singleton
{
protected:
    static T* ms_Singleton;

public:
    Singleton( void )
    {
        ……
    }

    ~Singleton( void )
    {
        ……
    }

    static T& GetSingleton( void )
    {
        ……
    }

    static T* GetSingletonPtr( void )
    {
        ……
    }
}

// ResManager.h
#include "Singleton.h"
class __declspec( dllexport ) ResManager: public Singleton<ResManager>
{
public:
    ResManager(void);
    ~ResManager(void);

public:
    static ResManager& GetSingleton(void);
    static ResManager* GetSingletonPtr(void);

    ……
    ……
}

// ResManager.cpp
#include "ResManager.h"

template<> ResManager* Singleton<ResManager>::ms_Singleton = 0;
ResManager* ResManager::GetSingletonPtr(void)
{
    return ms_Singleton;
}
ResManager& ResManager::GetSingleton(void)
{  
    assert( ms_Singleton );  
    return ( *ms_Singleton );  
}

ResManager::ResManager(void)
{
    ……
}

ResManager::~ResManager(void)
{
    ……
}

……
……

编译成功,没有问题。

////////////////////////////////////////////////////////

2、新建一个Win32程序的工程 MyTest

// MyTest.h
#include "ResManager.h"
#pragma comment( lib, "ResManager.lib" )
……
……

// MyTest.cpp
……
ResManager *pResMgr = new ResManager();
……

编译失败,提示:
stdafx.obj : error LNK2001: 无法解析的外部符号 "protected: static class ResManager * Singleton<class ResManager>::ms_Singleton" (?ms_Singleton@?$Singleton@VResManager@1PAVResManager@2@A)
Debug/MyTest.exe : fatal error LNK1120: 1 个无法解析的外部命令

问题一:请问这里编译失败是什么原因?


////////////////////////////////////////////////////

3、如果把 Singleton 类声明改为:

// Singleton.h
template <typename T> class __declspec( dllexport ) Singleton
{
    ……
    ……
}

此时DLL编译成功,MyTest.exe也编译成功。

//////////////////////////////////////////////////////

4、如果为ResManager类添加一个std::string的变量

// ResManager.h
#include "Singleton.h"
class __declspec( dllexport ) ResManager: public Singleton<ResManager>
{
public:
    ResManager(void);
    ~ResManager(void);

public:
    static ResManager& GetSingleton(void);
    static ResManager* GetSingletonPtr(void);

    ……
    ……

private:
    std::string m_strName;
    ……
}

此时 DLL 编译成功,MyTest.exe 编译失败,提示和前面的错误一样:

stdafx.obj : error LNK2001: 无法解析的外部符号 "protected: static class ResManager * Singleton<class ResManager>::ms_Singleton" (?ms_Singleton@?$Singleton@VResManager@1PAVResManager@2@A)
Debug/MyTest.exe : fatal error LNK1120: 1 个无法解析的外部命令

问题二:请问这里编译出错是什么原因?该如何解决?前者不添加这个std::string的变量就OK,添加了之后,后者就编译通不过。

写得有点乱,不知道DX们能不能看懂。

谢谢!


//////////////////////////////////////////////////////////////
该问题的DLL和EXE工程源代码在附件中!
//////////////////////////////////////////////////////////////

sf_20051216163157.rar

537.07 KB, 下载次数:

14

主题

245

帖子

256

积分

中级会员

Rank: 3Rank: 3

积分
256
QQ
发表于 2005-12-16 19:36:00 | 显示全部楼层

Re:请问:关于 DLL、Singleton 和 STL 的问题,谢谢!

在派生对象中加入

friend class Singleton<ResManager>;

然后在实现文件中
template<> ResManager* Singleton<ResManager>::ms_Instance=0;

再编译试试.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-22 23:36

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表