过去几年我被C#编码宠坏了,现在我又回到了C ++,并发现我遇到的问题很简单。我正在使用名为DarkGDK的gamedev的第三方库(任何以db为前缀的命令),但是DGDK不是问题。
继承我的代码:
system.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;
};
System.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):错误C2677: binary'[':找不到全局运算符 它采用'std :: string'类型(或者 没有可接受的转换)
如果我将地图更改为静态,我会收到此链接器错误:
1&gt; System.obj:错误LNK2001: 未解决的外部符号“私人: static class std :: map,class std :: allocator&gt;,int,struct 的std ::少,类 std :: allocator&gt; &GT;,类 的std ::分配器,类 std :: allocator&gt; const,int&gt; &GT; &GT; 系统:: m_images” (?m_images @ @@系统0V?$地图@ V'$ basic_string的@ DU?$ char_traits @ d @ @@ STD V'$分配器@ d @ @@ 2 STD @@ HU?$ @少V'$ basic_string的@ DU?$ char_traits @ d @ @@ STD V'$分配器@ d @ @@ 2 STD @@@ 2 @ V'$分配器@ U&$对@ $$ CBV?$ basic_string的@ DU?$ char_traits @ d @ STD @@ V'$分配器@ d @ @@ 2 STD @@ H + STD @@@ 2 @@ STD @@ A)
你们中任何一个聪明的人都可以帮助我吗?
答案 0 :(得分:6)
第一个是编译器错误,因为您无法从静态方法访问非静态数据成员。 this
指针不会被隐含地传递给静态方法,因此它们无法访问绑定到实例的数据成员。
在秒的情况下,请注意static map<string,int> m_images;
只是变量的声明。您需要使用源文件中的map<string, int> System::m_images;
定义静态成员变量。这将消除链接器错误。
答案 1 :(得分:1)
由于m_images
是类的非静态成员,因此当您从静态成员函数访问它时,需要指定要使用其m_images
成员的对象。如果只应该是该类的所有对象共享的单个m_images
对象,那么您也希望将其设为static
。
答案 2 :(得分:1)
静态成员始终在程序中明确定义。所以它必须以某种方式在System.cpp中初始化。如果没有,你会得到未解决的外部错误。
以下是几个例子的链接