如何正确打印枚举类型
How to properly print enum type
我有这个 class c++ 代码:
#include <iostream>
#include <cstring>
using namespace std;
enum tip{txt,
pdf,
exe
};
class File{
private:
char *imeDatoteka{nullptr};
tip t;
char *imeSopstvenik{nullptr};
int goleminaFile = 0;
public:
File(){}
File(char *i, char *imeS, int golemina, tip tip){
t = tip;
goleminaFile = golemina;
imeDatoteka = new char[strlen(i)+1];
imeSopstvenik = new char[strlen(imeS)+1];
strcpy(imeDatoteka, i);
strcpy(imeSopstvenik, imeS);
}
File(const File &f){
t = f.t;
goleminaFile = f.goleminaFile;
imeDatoteka = new char[strlen(f.imeDatoteka)+1];
imeSopstvenik = new char[strlen(f.imeSopstvenik)+1];
strcpy(imeDatoteka, f.imeDatoteka);
strcpy(imeSopstvenik, f.imeSopstvenik);
}
~File(){
delete [] imeDatoteka;
delete [] imeSopstvenik;
}
File &operator=(const File &f){
if(this != &f){
t = f.t;
goleminaFile = f.goleminaFile;
delete [] imeDatoteka;
delete [] imeSopstvenik;
imeDatoteka = new char[strlen(f.imeDatoteka)+1];
imeSopstvenik = new char[strlen(f.imeSopstvenik)+1];
strcpy(imeDatoteka, f.imeDatoteka);
strcpy(imeSopstvenik, f.imeSopstvenik);
}
return *this;
}
void print(){
cout<<"File name: "<<imeDatoteka<<"."<<(tip) t<<endl;
cout<<"File owner: "<<imeSopstvenik<<endl;
cout<<"File size: "<<goleminaFile<<endl;
}
bool equals(const File & that){
if((strcmp(imeDatoteka, that.imeDatoteka) == 0) && (t == that.t) && (strcmp(imeSopstvenik, that.imeSopstvenik) == 0))
return true;
else
return false;
}
bool equalsType(const File & that){
if((strcmp(imeDatoteka, that.imeDatoteka) == 0) && (t == that.t))
return true;
else
return false;
}
};
我有一个问题。所以我有一个私有成员 'tip' 是枚举类型。问题是它没有正确打印(pdf、txt 或 exe),它只打印 0,1 或 2。我看到有些人试图将它投射到 cout 中,但它对我不起作用。有帮助吗?
您可以使用映射和字符串创建查找 table:
#include <map>
#include <string>
std::map<tip, std::string> tip_to_string = {
{txt, "txt"},
{pdf, "pdf"},
{exe, "exe"}
};
然后当你想打印一些小费时:
std::cout << tip_to_string.at(t) << std::endl;
或者你可以做一个函数:
std::string tip_to_string(tip t) {
switch(t) {
case txt:
return "txt";
case pdf:
return "pdf";
case exe:
return "exe";
default:
return "You forgot to add this tip to the tip_to_string function.";
}
}
然后当你想打印一些小费时:
std::cout << tip_to_string(t) << std::endl;
我认为没有办法将枚举打印为字符串,但对 C++ 了解更多的人可能会回答这个问题。这可能是一个有用的阅读:https://en.cppreference.com/w/cpp/language/enum
#include <vector>
#include <string>
enum class Color
{
RED,
BLUE
};
constexpr std::vector<Color> COLORS_ENUMS = { Color::RED, Color::BLUE };
constexpr std::vector<std::string> COLORS_STRGS = { [Color::RED] = "RED", [Color::BLUE] = "BLUE" };
C++ 20 应该支持这个,然后你可以这样做:
const Color r = Color::RED;
const std::string& str_of_enum = COLORS_STRGS[r];
这里没有测试,如有错误请指正
我有这个 class c++ 代码:
#include <iostream>
#include <cstring>
using namespace std;
enum tip{txt,
pdf,
exe
};
class File{
private:
char *imeDatoteka{nullptr};
tip t;
char *imeSopstvenik{nullptr};
int goleminaFile = 0;
public:
File(){}
File(char *i, char *imeS, int golemina, tip tip){
t = tip;
goleminaFile = golemina;
imeDatoteka = new char[strlen(i)+1];
imeSopstvenik = new char[strlen(imeS)+1];
strcpy(imeDatoteka, i);
strcpy(imeSopstvenik, imeS);
}
File(const File &f){
t = f.t;
goleminaFile = f.goleminaFile;
imeDatoteka = new char[strlen(f.imeDatoteka)+1];
imeSopstvenik = new char[strlen(f.imeSopstvenik)+1];
strcpy(imeDatoteka, f.imeDatoteka);
strcpy(imeSopstvenik, f.imeSopstvenik);
}
~File(){
delete [] imeDatoteka;
delete [] imeSopstvenik;
}
File &operator=(const File &f){
if(this != &f){
t = f.t;
goleminaFile = f.goleminaFile;
delete [] imeDatoteka;
delete [] imeSopstvenik;
imeDatoteka = new char[strlen(f.imeDatoteka)+1];
imeSopstvenik = new char[strlen(f.imeSopstvenik)+1];
strcpy(imeDatoteka, f.imeDatoteka);
strcpy(imeSopstvenik, f.imeSopstvenik);
}
return *this;
}
void print(){
cout<<"File name: "<<imeDatoteka<<"."<<(tip) t<<endl;
cout<<"File owner: "<<imeSopstvenik<<endl;
cout<<"File size: "<<goleminaFile<<endl;
}
bool equals(const File & that){
if((strcmp(imeDatoteka, that.imeDatoteka) == 0) && (t == that.t) && (strcmp(imeSopstvenik, that.imeSopstvenik) == 0))
return true;
else
return false;
}
bool equalsType(const File & that){
if((strcmp(imeDatoteka, that.imeDatoteka) == 0) && (t == that.t))
return true;
else
return false;
}
};
我有一个问题。所以我有一个私有成员 'tip' 是枚举类型。问题是它没有正确打印(pdf、txt 或 exe),它只打印 0,1 或 2。我看到有些人试图将它投射到 cout 中,但它对我不起作用。有帮助吗?
您可以使用映射和字符串创建查找 table:
#include <map>
#include <string>
std::map<tip, std::string> tip_to_string = {
{txt, "txt"},
{pdf, "pdf"},
{exe, "exe"}
};
然后当你想打印一些小费时:
std::cout << tip_to_string.at(t) << std::endl;
或者你可以做一个函数:
std::string tip_to_string(tip t) {
switch(t) {
case txt:
return "txt";
case pdf:
return "pdf";
case exe:
return "exe";
default:
return "You forgot to add this tip to the tip_to_string function.";
}
}
然后当你想打印一些小费时:
std::cout << tip_to_string(t) << std::endl;
我认为没有办法将枚举打印为字符串,但对 C++ 了解更多的人可能会回答这个问题。这可能是一个有用的阅读:https://en.cppreference.com/w/cpp/language/enum
#include <vector>
#include <string>
enum class Color
{
RED,
BLUE
};
constexpr std::vector<Color> COLORS_ENUMS = { Color::RED, Color::BLUE };
constexpr std::vector<std::string> COLORS_STRGS = { [Color::RED] = "RED", [Color::BLUE] = "BLUE" };
C++ 20 应该支持这个,然后你可以这样做:
const Color r = Color::RED;
const std::string& str_of_enum = COLORS_STRGS[r];
这里没有测试,如有错误请指正