c++ - 字符串和整数的映射

标签 c++ string dictionary

我想用 C++ 制作一个 DVD 租赁应用程序。我已经完成了客​​户类的基础知识,以及另一个保存客户 ID 的类,称为 CustomerDB。每个客户都有一个唯一的ID。
我想在进一步研究程序之前测试 CustomerDB,但在编译程序时出现错误。

这是我写的代码:

头文件:

// DVD_App.h - Header File

#include <string>
#include <map>

using namespace std;

enum Status {ACTIVE, INACTIVE};

class Customer {
    private:
        string id;
        string name;
        string address;
        Status status;

    public:
        Customer (const string&, const string&, const Status);
        string &getId () { return id; }
};

class CustomerDB {
    private:
        static map<string, int> idList;

    public:
        static void addNewToIdList (const string &threeLetterOfName) {
            if (!doesThreeLettersOfNameExist(threeLetterOfName))
                idList.insert(pair<string, int>(threeLetterOfName, 0));
        }

        static bool doesThreeLettersOfNameExist (const string &threeLetterOfName) {
            map<string, int>::iterator i = idList.find(threeLetterOfName);
            if ((i->first).compare(threeLetterOfName) != 0)
                return false;
            return true;
        }

        static int nextNumber (const string &threeLetterOfName) {
            map<string, int>::iterator i = idList.find(threeLetterOfName);
            ++(i->second);
            return i->second;
        }
};

和源代码文件:

// DVD_App.cpp - C++ Source Code

#include <iostream>
#include <string>
#include "DVD_App.h"

using namespace std;

Customer::Customer (const string &cName, const string &cAddress, const Status cStatus) : name(cName), address(cAddress), status(cStatus) {
    string threeLetters = name.substr(0, 3);
    if (CustomerDB::doesThreeLettersOfNameExist(threeLetters))
        threeLetters += "" + CustomerDB::nextNumber(threeLetters);
    else {
        CustomerDB::addNewToIdList(threeLetters);
        threeLetters += "0";
    }
}

int main () {
    Customer k ("khaled", "beirut", ACTIVE);
    cout << k.getId() << endl;

    return 0;
}

我得到的错误是:

C:\Users\KiKo-SaMa\Desktop\C++>g++ DVD_App.cpp
C:\Users\KIKO-S~1\AppData\Local\Temp\ccSsS5HX.o:DVD_App.cpp:(.text$_ZN10Customer
DB14addNewToIdListERKSs[CustomerDB::addNewToIdList(std::basic_string<char, std::
char_traits<char>, std::allocator<char> > const&)]+0x59): undefined reference to
 `CustomerDB::idList'
C:\Users\KIKO-S~1\AppData\Local\Temp\ccSsS5HX.o:DVD_App.cpp:(.text$_ZN10Customer
DB27doesThreeLettersOfNameExistERKSs[CustomerDB::doesThreeLettersOfNameExist(std
::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)]+0x1
0): undefined reference to `CustomerDB::idList'
C:\Users\KIKO-S~1\AppData\Local\Temp\ccSsS5HX.o:DVD_App.cpp:(.text$_ZN10Customer
DB10nextNumberERKSs[CustomerDB::nextNumber(std::basic_string<char, std::char_tra
its<char>, std::allocator<char> > const&)]+0x10): undefined reference to `Custom
erDB::idList'
collect2: ld returned 1 exit status

我的程序有什么问题?

最佳答案

您已经声明了静态变量 idList(在 .h 文件中),但没有定义它(在 .cpp 文件中) 例如

map<string, int> CustomerDB::idList;
int main () {
...
}

关于c++ - 字符串和整数的映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10347857/

相关文章:

Delphi TObjectDictionary 具有类实例键

c++ - 我可以在 Bigger Linux for Galileo 上的常规 C++ 程序中 #include "arduino.h"吗?

c++ - 在具有严格内存限制的 O(n^3) 中求解 5SUM

c# - 无法添加对 WinRT C++ DLL 项目的引用

java - 如何检查 Java 字符串是否包含 GSM 扩展字符(非 Unicode)

javascript在第二次出现 "/"时替换文本

ios - 无法附加到空字符串

c++ - OpenCV:相对于引用图像移动/对齐面部图像(图像配准)

dictionary - 如何使用 dart Map.fromEntries() 构造函数?

c++ - boost::assign 与 std::map