C ++构造函数和类?

问题描述 投票:-1回答:2

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

该代码是为我输入数字等级和字母,例如作为回报,它应该告诉我第一个值的字母等级,以及字母的数值: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++ class declaration default-constructor construct
2个回答
1
投票

对于初学者,这两个成员函数无效

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

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

似乎是您的意思

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

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

该类没有默认的构造函数。所以这个声明

Grade g;

是不正确的,因为此处将调用缺少的默认构造函数。

例如为创建的对象指定自变量,例如

Grade g( 100, 'A' );

0
投票

好的,首先要考虑的是:您完全滥用了动态内存。动态分配single int或单个char没有意义。指针的大小至少为int的大小,如果不是大小的两倍(取决于CPU和OS的组合),则为char的大小是大小的4或8倍。加上间接费用。

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

最后但并非最不重要的一点,访问说明符的全部要点是使类成员远离外界的手(在某种程度上,您仍可以通过记忆伏都教来操纵它们)。

所以让我们摆脱它。

首先包含iostream和sstream进行输出

 #include <sstream>
 #include <

 class Grade {

只是普通成员,没有动态

     int  percent;
     char letter;

使static和const将其移到可执行文件.rodata部分中>

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

用于转换的静态帮助器函数,由设置方法和构造方法使用:

    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;
}
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.