【问题标题】:C++ How to implement an unordered_map in .cpp that is instantiated in a header?C ++如何在.cpp中实现一个在标头中实例化的unordered_map?
【发布时间】:2016-12-11 04:52:48
【问题描述】:

我正在做一个项目,我必须使用 unordered_maps 来为莫尔斯电码创建定义,然后使用它们来转换为莫尔斯电码和从莫尔斯电码转换。我完全不知道我应该如何从 .cpp 文件的标头中填充私有声明的 unordered_map 。

对我来说,跨文件使用私有成员函数一直是 C++ 中一个令人难以置信的头痛,并且没有多少研究清楚它实际上是如何工作的,因此非常欢迎任何建议。谢谢。

这是我的代码。

莫尔斯.h:

#ifndef _MORSE_H
#define _MORSE_H 3710201612

#define MORSE_SET 45

#include <string>
#include <unordered_map>

using namespace std;

class MorseCode
{
  public:
    MorseCode ();

    string enCode(const char&) const;
    char   deCode(const string&) const;

  private:
    unordered_map<char,string> encodeMap;
    unordered_map<string,char> decodeMap;
};

#endif

莫尔斯.cpp:

#include <iostream>
#include <string>
#include <unordered_map>

#include "Morse.h"
using namespace std;

MorseCode::MorseCode()
{
}

string MorseCode::encodeMap
 {
    { 'A', ".-" }, { 'B', "-..." }, { 'C', "-.-." }, { 'D', "-.." }, { 'E', "." },
    { 'F', "..-." }, { 'G', "--." }, { 'H', "...." }, { 'I', ".." }, { 'J', ".---" }, { 'K', "-.-" },
    { 'L', ".-.." }, { 'M', "--" }, { 'N', "-." }, { 'O', "---" }, { 'P', ".--." }, { 'Q', "--.-" },
    { 'R', ".-." }, { 'S', "..." }, { 'T', "-" }, { 'U', "..-" }, { 'V', "...-" }, { 'W', ".--" },
    { 'X', "-..-" }, { 'Y', "-.--" }, { 'Z', "--.." }, { '1', ".----" }, { '2', "..---" }, { '3', "...--" }, { '4', "....-" }, 
    { '5', "....." }, { '6', "-...." }, { '7', "--..." }, { '8', "---.." }, { '9', "----." }, { '0', "-----" },
    { '.', ".-.-.-" }, { ',', "--..--" }, { ':', "---..." }, { '?', "..--.." }, { '-', "-...-" },
    { '/', "-..-." }
};

char MorseCode::deCode(const string &) const
{
    return 0;
}

【问题讨论】:

  • 要么将encodeMap设为静态,要么在MorseCode构造函数中初始化。
  • 我对在摩尔斯电码中初始化 encodeMap 的语法感到非常困惑。我试过做 MorseCode::encodeMap 你的意思是不在 Morse.h 的私有部分初始化它吗?是否无法在我的 .cpp 中填充 encodeMap 而不使其成为静态或在其他地方初始化?
  • user4581301 很好地回答了您的问题。一些不相​​关的提示:1)stackoverflow.com/q/1452721/6646408 不要在头文件中使用using namespace std 2)_MORSE_H 是保留名称,因为它以下划线和大写字母开头。安全的经验法则:不要使用带有双下划线或前导下划线的标识符名称。 3) 给_MORSE_H 包含保护宏赋值是多余的。唯一重要的是是否定义了该名称的宏。如果您的目标是确保唯一性,则需要将随机字符添加到宏名称本身。

标签: c++ header unordered-map private-members


【解决方案1】:

看起来你想要的是static 成员

在 Morse.h 中更改

unordered_map<char,string> encodeMap;

static unordered_map<char,string> encodeMap;

并在 Morse.cpp 中添加

unordered_map<char,string> MorseCode::encodeMap{
    { 'A', ".-" }, { 'B', "-..." }, { 'C', "-.-." }, { 'D', "-.." }, { 'E', "." },
    { 'F', "..-." }, { 'G', "--." }, { 'H', "...." }, { 'I', ".." }, { 'J', ".---" }, { 'K', "-.-" },
    { 'L', ".-.." }, { 'M', "--" }, { 'N', "-." }, { 'O', "---" }, { 'P', ".--." }, { 'Q', "--.-" },
    { 'R', ".-." }, { 'S', "..." }, { 'T', "-" }, { 'U', "..-" }, { 'V', "...-" }, { 'W', ".--" },
    { 'X', "-..-" }, { 'Y', "-.--" }, { 'Z', "--.." }, { '1', ".----" }, { '2', "..---" }, { '3', "...--" }, { '4', "....-" }, 
    { '5', "....." }, { '6', "-...." }, { '7', "--..." }, { '8', "---.." }, { '9', "----." }, { '0', "-----" },
    { '.', ".-.-.-" }, { ',', "--..--" }, { ':', "---..." }, { '?', "..--.." }, { '-', "-...-" },
    { '/', "-..-." }
};

Member Initializer List

在 Morse.cpp 中改变

MorseCode::MorseCode()
{
}

MorseCode::MorseCode(): encodeMap {
           { 'A', ".-" }, { 'B', "-..." }, { 'C', "-.-." }, { 'D', "-.." }, { 'E', "." },
           { 'F', "..-." }, { 'G', "--." }, { 'H', "...." }, { 'I', ".." }, { 'J', ".---" }, { 'K', "-.-" },
           { 'L', ".-.." }, { 'M', "--" }, { 'N', "-." }, { 'O', "---" }, { 'P', ".--." }, { 'Q', "--.-" },
           { 'R', ".-." }, { 'S', "..." }, { 'T', "-" }, { 'U', "..-" }, { 'V', "...-" }, { 'W', ".--" },
           { 'X', "-..-" }, { 'Y', "-.--" }, { 'Z', "--.." }, { '1', ".----" }, { '2', "..---" }, { '3', "...--" }, { '4', "....-" },
           { '5', "....." }, { '6', "-...." }, { '7', "--..." }, { '8', "---.." }, { '9', "----." }, { '0', "-----" },
           { '.', ".-.-.-" }, { ',', "--..--" }, { ':', "---..." }, { '?', "..--.." }, { '-', "-...-" },
           { '/', "-..-." }
       }
{
}

第一个选项static 可能更好,因为它不会在每个摩尔斯电码实例中重复encodeMap

decodeMap做同样的事情。

【讨论】:

  • 啊! “MorseCode::MorseCode(): encodeMap”的语法让我着迷!我在任何地方都找不到如何从头文件中填充 unordered_map 的示例!谢谢!不过,这确实使我陷入了另一个难题。这段代码有什么用?也很抱歉,如果没有发布问题时可用的方便工具箱,我无法弄清楚如何“编码”此文本。字符串 enCode(const char&) const; char deCode(const string&) const;
  • @BrenBailey 编码最好的方法是使用大多数北美英语键盘上的 ` 重音和 ~。即便如此,代码也将全部压缩到一行上。这些是MorseCode 方法的声明。您将需要实现这些方法。你的教科书应该能够比我在评论中更好地解释这一点。 And if it can't, this one can.你也可以在这里找到你需要的东西:isocpp.org/tour
猜你喜欢
  • 2021-12-30
  • 2016-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多