Как избавиться от неразрешенной ошибки внешнего символа «private: static char» в C ++? - PullRequest
0 голосов
/ 11 сентября 2018

У меня такое ощущение, что я упускаю что-то действительно глупое, но все же: у меня есть эта досадная ошибка "внешнего символа" в игровом движке, который я пишу:

По сути, я хочу создать класс, который читает путь в некоторых глобальных переменных (поэтому мне не нужно отправлять их повсюду). Я использовал NFD (nativefiledialog) из github для открытия файлов. До этого я проверял это непосредственно в main.cpp, но проблемы возникали только после помещения его в класс.

https://github.com/mlabbe/nativefiledialog

paths.h

#pragma once
#include <iostream>
#include <nfd.h>

namespace RW {
    class Paths {
    private:
        static nfdchar_t *gamePath;
        static nfdresult_t result;
    public:
        static void chooseGamePath();
    };
}

Paths.cpp

#include "Paths.h"

namespace RW {
    nfdchar_t Paths::*gamePath = NULL;
    nfdresult_t Paths::result;

    void Paths::chooseGamePath()
    {
        result = NFD_OpenDialog(NULL, NULL, &gamePath);;
        std::cout << "Please choose the location of the warcraft's exe file!" << std::endl;

        if (result == NFD_OKAY) {
            std::cout << "Success!" << std::endl;
            std::cout << gamePath << std::endl;
            free(gamePath);
        }
        else if (result == NFD_CANCEL) {
            std::cout << "User pressed cancel." << std::endl;
        }
        else {
            std::cout << "Error: " << NFD_GetError() << std::endl;
        }
    }
}

Ошибка:

Severity    Code    Description Project File    Line    Suppression State
Error   LNK2001 unresolved external symbol "private: static char * RW::Paths::gamePath" (?gamePath@Paths@RW@@0PADA) Half-an Engine  D:\Programozás\Repositories\Warcraft-II-HD\Half-an Engine\Paths.obj 1   

1 Ответ

0 голосов
/ 11 сентября 2018

В файле cpp эта строка:

nfdchar_t Paths::*gamePath = NULL;

Объявляет указатель на член с именем gamePath, который может указывать только на член класса Paths, который имеет тип nfdchar_t.

Но это не то, что вы объявили gamePath членом, как в Paths классе. Вы объявили его как простой (статический) nfdchar_t* указатель.

Вместо этого измените эту строку на:

nfdchar_t* Paths::gamePath = NULL;

Это объявляет переменную с именем gamePath, которая является членом класса Paths и имеет тип nfdchar_t*. Это соответствует вашему объявлению gamePath в объявлении класса Paths.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...