2

在过去的几年里,我被 C# 编码宠坏了,现在我回到 C++ 上,发现我在处理本应简单的东西时遇到了麻烦。我正在使用名为 DarkGDK 的第三方游戏开发库(任何以 db 为前缀的命令),但是 DGDK 不是问题。

这是我的代码:

系统.h

#pragma once

#include <string>
#include <map>
#include "DarkGDK.h"

using namespace std;

class System
{
public:
    System();
    ~System();
    void Initialize();

    static void LoadImage(string fileName, string id);
    static int GetImage(string id);

private:
    map<string, int> m_images;
};

系统.cpp

#include "System.h"

System::System()
{
}

System::~System()
{
}

void System::Initialize()
{
    dbSetDisplayMode (1024, 640, 32);
    dbSetWindowTitle ("the Laboratory");
    dbSetWindowPosition(100, 10);

    dbSyncOn         ();
    dbSyncRate       (60);

    dbRandomize(dbTimer());
}

void System::LoadImage(string fileName, string id)
{
    int i = 1;

    while (dbImageExist(i))
    {
        i++;
    }

    dbLoadImage(const_cast<char*>(fileName.c_str()), i, 1);
    m_images[id] = i;
}

int System::GetImage(string id)
{
    return m_images[id];
}

这里的想法是有一个映射字符串与整数值的映射,以使用字符串而不是硬编码值来访问图像。这个类没有完成,所以它不处理像卸载图像这样的事情。我想在不传递 System 实例的情况下访问图像方法,所以我使用了 static。

现在我得到这个错误:

blahblah\system.cpp(39) : error C2677: binary '[' : no global operator found which take type 'std::string' (或者没有可接受的转换)

如果我将地图更改为静态,我会收到此链接器错误:

1>System.obj:错误 LNK2001:未解析的外部符号“私有:静态类 std::map,class std::allocator >,int,struct std::less,class std::allocator > >,class std::allocator ,class std::allocator > const ,int> > > System::m_images" (?m_images@System@@0V?$map@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@ D@2@@std@@HU?$less@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U ?$pair@$$CBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@H@std@@@2@@std@@A)

你们中的任何一个聪明的家伙可以帮助我吗?

4

3 回答 3

6

第一个是编译器错误,因为您无法从静态方法访问非静态数据成员。this指针不会隐式传递给静态方法,因此它们无法访问绑定到实例的数据成员。

在秒的情况下,请注意这static map<string,int> m_images;只是一个变量的声明。您需要在源文件中定义静态成员变量。map<string, int> System::m_images;这将摆脱链接器错误。

于 2010-08-11T04:59:16.293 回答
1

由于m_images是类的非静态成员,当您从静态成员函数访问它时,您需要指定m_images要使用其成员的对象。如果该类的所有对象只应该m_images共享一个对象,那么您也希望创建它static

于 2010-08-11T04:59:54.530 回答
1

静态成员总是在程序中显式定义。所以它必须在 System.cpp 中以某种方式初始化。如果没有,您将收到未解决的外部错误。

这是几个示例的链接

http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.10

于 2010-08-11T05:07:05.893 回答