我刚刚删除了一个未设置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;
}
答案 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[]
如果您还打算在其他地方查看地图,那么将查找代码分成其自己的功能是个好主意。