首页 > 解决方案 > C++ 构造函数和类?

问题描述

我是 C++ 新手,我正在尝试学习如何使用构造函数和类。我的代码通过结构在 C 中正确运行,但是当我尝试在 C++ 中实现类时,我得到了错误,我不知道从哪里来。

该代码是为了让我输入一个数字等级和一个字母,例如 100 F。作为回报,它应该告诉我第一个值的字母等级,以及字母的数值:100:A 和 45:F。我确信这些功能是正确的,我主要是有道理的。我得到的错误说G级没有匹配功能;在我的主要。

class Grade {

public:

    int* percent;
    char* letter;
    char GRADE_MAP [11] = {'F', 'F', 'F', 'F', 'F', 'F', 'D', 'C', 'B', 'A', 'A'};

    Grade(int p, char l){
        percent = new int;
        letter = new char;
        *percent = p;
        *letter = l;
    }

    ~Grade(){
        delete percent;
        delete letter;
    }

    void setByPercent(int p){
        p = *percent;
        *letter = GRADE_MAP[p / 10];
    }

    void setByLetter(char l){
        l = *letter;
        *percent = 100 - (l - 'A') * 10 - 5;
    }

    void print(){
        printf("Grade: %d: %c \n", *percent, *letter);
    }
};


int main() {

    int percent;
    Grade g;

    printf("Enter two grades separated by a space. Use a percentage for the first and letter for the second: \n");

    scanf("%d", &percent);
    scanf("\n");

    g.setByPercent(percent);
    g.print();

    g.setByLetter(getchar());
    g.print();

    return 0;
}

标签: c++classdeclarationdefault-constructorconstruct

解决方案


好的,首先要做的事情是:您完全滥用了动态内存。动态分配单个int 或单个 char 没有意义。指针至少是 int 的大小,如果不是大小的两倍(取决于 CPU 和 OS 的组合),对于 char 来说,它是大小的 4 或 8 倍。加上间接成本。

此外,通过将其GRADE_MAP定义为常规的、已初始化的类成员,您将为每个实例创建一个副本。

最后但并非最不重要的一点是,访问说明符的全部目的是将类成员从外界手中拉走(在某种程度上,您仍然可以通过做记忆巫术来操纵它们)。

所以让我们摆脱它。

首先包括 iostream 和 sstream 用于输出

 #include <sstream>
 #include <iostream>

 class Grade {

只是普通会员,没有动态

     int  percent;
     char letter;

makestatic和 const 把它移到可执行文件.rodata部分

    static char const GRADE_MAP [11] = {'F', 'F', 'F', 'F', 'F', 'F', 'D', 'C', 'B', 'A', 'A'};

用于转换的静态辅助函数,由 setter 和构造函数使用:

    static int fromLetter(char l){
        int p = 100 - (l - 'A') * 10 - 5;
        if( 0 > p || 100 < p ){
            throw std::range_error("equivalent percentage out of range");
        }
        return p;
    }
    static char fromPercent(int p){
        if( 0 > p || 100 < p ){
            throw std::range_error("percentage out of range");
        }
        return GRADE_MAP[p / 10];
    }

构造函数应该是公开的

public:

在此处使用初始化程序

     Grade(int p)
     : percent(p)
     , letter( fromPercent(p) )
     {}

     Grade(char l)
     : percent( fromLetter(l) )
     , letter( l )
     {}


     ~Grade(){}

您可能打算从 p 访问百分比。您编写它的方式忽略了参数

    void setByPercent(int p){
         percent = p;
         letter = fromPercentage(p);
    }

    void setByLetter(char l){
         letter = l;
         percent = fromLetter(l);
    }

最后是 C++ -ish 并使用 iostream

     basic_ostringstream strstr(){
         basic_ostringstream os;
         os << "Grade: " << percent << ": " << letter;
         return os;
     }
};

int main() {

    int percent, letter;
     std::cout << "Enter two grades separated by a space. Use a percentage for the first and letter for the second:" << std::endl;
     std::cin >> percent >> letter;     

     Grade g1(percent)
     Grade g2(letter)

     std::cout << g1.strstr() << "; " << g2.strstr() << std::endl;
    return 0;
}

推荐阅读