无法声明并将Map指定为const

时间:2016-04-28 02:07:46

标签: c++ const stdmap

我刚刚删除了一个未设置4小时的问题。我通过一些试验和错误大部分都能够自己回答它,除了一件之外,似乎对它有很好的处理。为什么我不能将我的地图声明为const或者我做错了?完整的例子在底部。

在课程标题

const std::map <char, char> UppercaseConvert;

在类构造函数

const UppercaseConvert = { { 'A','a' },{ 'B','b' },{ 'C','c' },{ 'D','d' },{ 'E','e' },{ 'F','f' },
                     { 'G','g' },{ 'H','h' },{ 'I','i' },{ 'J','j' },{ 'K','k' },{ 'L','l' },
                     { 'M','m' },{ 'N','n' },{ 'O','o' },{ 'P','p' },{ 'Q','q' },{ 'R','r' },
                     { 'S','s' },{ 'T','t' },{ 'U','u' },{ 'V','v' },{ 'W','w' },{ 'X','x' },
                     { 'Y','y' },{ 'Z','z' } };

如果我从声明和定义中删除const,它将编译并工作,因此它不是世界末日。但是,因为它应该是静态的,不应该有const类型吗?

这是它用于的功能:

std::string BCLogic::ConvertToLowerCase(FString word) {
   std::string ConvertedString;
   for (char character : word) {
     if (UppercaseConvert[character]) {
         ConvertedString.push_back(UppercaseConvert[character]);
     }
     else ConvertedString.push_back(character);
     }
return ConvertedString;
}

编辑:除非删除const:

,否则将无法编译的完整示例
#include <iostream>
#include <string>
#include <map>


class Converter {

public:
    Converter();
    std::string ConvertToLowerCase(std::string);
    const std::map <char, char> UppercaseConvert;  //remove const to compile


};

Converter::Converter() {
    //remove const to compile
    const UppercaseConvert = { { 'A','a' },{ 'B','b' },{ 'C','c' },{ 'D','d'},{ 'E','e' },{ 'F','f' },
    { 'G','g' },{ 'H','h' },{ 'I','i' },{ 'J','j' },{ 'K','k' },{ 'L','l' },
    { 'M','m' },{ 'N','n' },{ 'O','o' },{ 'P','p' },{ 'Q','q' },{ 'R','r' },
    { 'S','s' },{ 'T','t' },{ 'U','u' },{ 'V','v' },{ 'W','w' },{ 'X','x' },
    { 'Y','y' },{ 'Z','z' } };
} 

std::string Converter::ConvertToLowerCase(std::string word) {

    std::string ConvertedString;
    for (char character : word) {
        if (UppercaseConvert[character]) {
            ConvertedString.push_back(UppercaseConvert[character]);
        }
        else ConvertedString.push_back(character);
    }
    return ConvertedString;
}


int main() {
    Converter ThisConverter;

    std::cout << "Enter a word in Caps:";
    std::string word;
    std::getline(std::cin, word);
    word = ThisConverter.ConvertToLowerCase(word);
    std::cout << "\n Your converted word is : " << word << std::endl;
    return 0;
}

1 个答案:

答案 0 :(得分:1)

const UppercaseConvert =是语法错误。当您引用已存在的变量时,只需在此处使用其名称UppercaseConvert即可。你不要重复其声明或限定词的某些部分。

我们来谈谈这一行:

UppercaseConvert = { { 'A','a' },{ 'B','b' },{ 'C','c' },{ 'D','d'},{ 'E','e' },{ 'F','f' },
{ 'G','g' },{ 'H','h' },{ 'I','i' },{ 'J','j' },{ 'K','k' },{ 'L','l' },
{ 'M','m' },{ 'N','n' },{ 'O','o' },{ 'P','p' },{ 'Q','q' },{ 'R','r' },
{ 'S','s' },{ 'T','t' },{ 'U','u' },{ 'V','v' },{ 'W','w' },{ 'X','x' },
{ 'Y','y' },{ 'Z','z' } };

这称为赋值。您正在将UppercaseConvert已有的值更改为不同的值。

因此,无法使UppercaseConvert成为const并且也有此行。因为如果是const,则无法更改其值。

我想您打算做的是初始化 UppercaseConvert。要初始化意味着提供变量在创建时将保留的值。到目前为止你编写它的方式,变量被初始化为一个空映射,你稍后尝试更改地图以在其中包含条目。构造函数体在成员变量完成初始化后运行。

Link to further reading about initialization for non-static members

在评论中,您似乎也希望地图是静态的。可能是个好主意。对于static成员,您不会在构造函数中放置任何内容。这是因为构造函数用于构造类的实例。但是静态成员不与任何特定实例相关联。静态成员意味着该成员总共有一个实例。

类定义应包含:

static const std::map<char, char> UppercaseConvert;

然后在实现此类的.cpp文件中,但在任何函数之外,您使用初始化程序编写定义(并且不要重复单词{{1}这里):

static

重要提示:即使此行包含const std::map<char, char> BCLogic::UppercaseConvert = { { 'A','a' },{ 'B','b' },{ 'C','c' },{ 'D','d'},{ 'E','e' },{ 'F','f' }, { 'G','g' },{ 'H','h' },{ 'I','i' },{ 'J','j' },{ 'K','k' },{ 'L','l' }, { 'M','m' },{ 'N','n' },{ 'O','o' },{ 'P','p' },{ 'Q','q' },{ 'R','r' }, { 'S','s' },{ 'T','t' },{ 'U','u' },{ 'V','v' },{ 'W','w' },{ 'X','x' }, { 'Y','y' },{ 'Z','z' } }; 符号, 也不是。这是一个声明。赋值和声明之间的区别在于赋值中指的是已存在的变量;在声明中,您正在创建一个由类型说明符显示的变量。事实上你可以(和probalby应该)从这一行省略=。但是我将其包含在内,因为您会看到人们在这里使用=

如评论中所述,您还需要更改第=行。 UppercaseConvert[character]只能在非const地图上使用,因为如果地图中不存在该字符,其部分行为是添加新条目。

循环可以是:

map::operator[]

如果您还打算在其他地方查看地图,那么将查找代码分成其自己的功能是个好主意。