如何正确打印枚举类型

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];

这里没有测试,如有错误请指正