【问题标题】:C++ vector issue - 'LNK2001: unresolved external symbol private: static...'C++ 矢量问题 - 'LNK2001:未解析的外部符号私有:静态...'
【发布时间】:2011-09-02 16:32:27
【问题描述】:

在有人指责我没有查看预先存在的问题之前,我已经查看并意识到它与声明有关,但我仍然无法让它工作(可能与我使用向量有关)。

Manager.h:

#include "Flight.h"
#ifndef manager_h
#define manager_h

class Manager {
    static vector<Airport> airports;
    static vector<Flight> flights;
public:
    static void loadAirports();
    static void loadFlights();
    static Airport getAirport(string code);
    static vector<string> split(const string &s, vector<string> &elems);
};

#endif

Manager.cpp:

#include "Manager.h"

void Manager::loadAirports ()
{
    ifstream airportfile("airports.txt");
    string line;
    while (getline(airportfile, line))
    {
        vector<string> values;
        split(line, values);
        Airport airport (values[0], values[1], atoi(values[2].c_str()));
        airports.push_back(airport);
    }
}

void Manager::loadFlights ()
{
    ifstream flightfile("flights.txt");
    string line;
    while (getline(flightfile, line))
    {
        vector<string> values;
        split(line, values);
        Flight flight (getAirport(values[0]), getAirport(values[1]), atoi(values[2].c_str()), atoi(values[3].c_str()));
        flights.push_back(flight);
    }
    cout << flights.size() << endl;
}

Airport Manager::getAirport (string code)
{
    for (int i = 1; i < (int)airports.size(); i++)
    {
        if (airports[i].code == code)
            return airports[i];
    }
    throw exception();
}

vector<string> Manager::split(const string &s, vector<string> &elems) {
    stringstream ss(s);
    string item;
    while(getline(ss, item, ',')) {
        elems.push_back(item);
    }
    return elems;
}

它正在抛出这个错误:

Manager.obj:错误 LNK2001: 未解析的外部符号“私有: 静态结构向量 经理::机场” (?airports@Manager@@0U?$Vector@UAirport@@@@A)

Manager.obj:错误 LNK2001: 未解析的外部符号“私有: 静态结构向量 经理::航班" (?flights@Manager@@0U?$Vector@UFlight@@@@A)

我意识到我需要定义向量,但是如何以及在哪里?我尝试创建一个空的构造函数,然后做

Manager::Manager ()
{
    vector<string> flights;
    vector<string> airports;
}

但它只是给了我一个重新定义的错误。

【问题讨论】:

    标签: c++


    【解决方案1】:

    您必须在.cpp 文件中定义它们:

    vector<string> Manager::flights;
    vector<string> Manager::airports;
    

    【讨论】:

    • 为什么是 而不是
    【解决方案2】:

    Oli 和 Constantinius 已经回答了您的实际问题,但我建议您更改课程。就目前而言,它只有静态成员,所以你永远不能创建这个类的对象。虽然这是合法的 C++,但它不符合 C++ 的精神(尽管有其他语言确实支持这种用法,例如 C#)

    所有静态成员都暗示您正在尝试某种单例,但还有更多标准方法可以强制实现类的单例。

    话虽如此 - 我主张从不将单例性放入一个类。而是将类编写为普通类,并提供一个单例包装器。这也有一个很好的副作用,可以防止您当前的代码可能遇到的臭名昭著的静态初始化顺序失败

    所以,类似(不包括为简洁起见):

    经理.h

    class Manager {
        vector<Airport> airports;
        vector<Flight> flights;
    public:
        Manager();
        void loadAirports();
        void loadFlights();
        Airport getAirport(string code);
        vector<string> split(const string &s, vector<string> &elems);
    };
    
    Manager& GetManager();
    

    Manager.cpp

    Manager::Manager()
    {
        loadAirports();
        loadFlights();
    }
    
    Manager& GetManager()
    {
        static Manager manager;
        return manager;
    }
    

    【讨论】:

    • 哦-还有一个单独的旁注-如果您使用std::set&lt;Airport&gt;std::map&lt;Airport&gt;而不是std::vector&lt;Airport&gt;,则可以避免getAirport中的线性搜索。
    【解决方案3】:

    在你的.cpp文件中,你需要添加静态变量的定义

    vector<Airport> Manager::airports;
    vector<Flight> Manager::flights;
    

    请参阅 C++ 常见问题解答中的 Why are classes with static data members getting linker errors?

    【讨论】:

    • 哦,我没有意识到它必须超出任何类型的函数或构造函数。
    • 只有一个静态实例,因此没有合适的构造函数。这很像您声明/定义全局变量的方式。例如。在标题中:extern int count; 和在源文件中:int count = 0;。 (另请注意,static 有多种不同的含义,具体取决于您在哪里找到它。)
    猜你喜欢
    • 2015-12-31
    • 1970-01-01
    • 2015-05-01
    • 2020-04-10
    • 1970-01-01
    • 1970-01-01
    • 2012-05-03
    • 2017-02-07
    • 1970-01-01
    相关资源
    最近更新 更多