试图使用静态方法/成员

时间:2010-08-11 04:55:05

标签: c++ static-methods static-members

过去几年我被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)

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

3 个答案:

答案 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中初始化。如果没有,你会得到未解决的外部错误。

以下是几个例子的链接

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