Попытка использовать статические методы / члены - PullRequest
2 голосов
/ 11 августа 2010

Последние несколько лет я был избалован кодированием на C #, и теперь я вернулся на C ++ и обнаружил, что у меня проблемы с вещами, которые должны быть простыми.Я использую стороннюю библиотеку для gamedev под названием DarkGDK (любые команды с префиксом 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: бинарный '[': глобальный оператор не найден, который принимает тип 'std :: string' (или нет приемлемого преобразования)

Если я изменяю карту на статическую, я получаю эту ошибку компоновщика:

1> System.obj: ошибка LNK2001: неразрешенный внешний символ "private: статический класс std :: map, класс std :: allocator>, int, struct std :: less, класс std:: allocator>>, класс std :: allocator, класс std :: allocator> const, int>>> System :: m_images "(? m_images @ System @@ 0V? $ map @ V? $ basic_string @ DU? $ char_traits @D @ станд @@ V? $ распределитель @ D @ 2 @@ станд @@ HU? $ меньше @ V? $ basic_string @ DU? $ char_traits @ D @ станд @@ V? $ распределитель @ D @ 2 @@ станд @@@ 2 @ V? $ распределитель @ U? $ @ пара $$ ОЦК? $ basic_string @ DU? $ char_traits @ D @ станд @@ V? $ распределитель @ D @ 2 @@ станд @@ H @ станд @@@2 @@ std @@ A)

Может ли кто-нибудь из вас, яркие парни, помочь мне?

Ответы [ 3 ]

6 голосов
/ 11 августа 2010

Первая ошибка компилятора, так как вы не можете получить доступ к элементам нестатических данных статическим методом. this Указатель неявно передается статическим методам, поэтому они не могут получить доступ к элементам данных, привязанным к экземпляру.

В секундах обратите внимание, что static map<string,int> m_images; - это просто объявление переменной. Вам необходимо определить статическую переменную-член, используя map<string, int> System::m_images; в исходном файле. Это избавит от ошибки компоновщика.

1 голос
/ 11 августа 2010

Статические члены всегда явно определены в вашей программе. Так что это должно быть как-то инициализировано внутри System.cpp. Если нет, вы получите неразрешенную внешнюю ошибку.

Вот ссылка на пару примеров

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

1 голос
/ 11 августа 2010

Поскольку m_images является нестатическим членом класса, при доступе к нему из статической функции-члена вам необходимо указать объект, элемент m_images которого вы хотите использовать.Если должен быть только один объект m_images, общий для всех объектов этого класса, вы также можете сделать его static.

...