如何在Class函数中编辑vector的私有成员?

时间:2019-06-01 13:13:19

标签: c++ class pointers vector

我正在工作,它是输入一些分数并打印出分数,排名和通过/失败。我正在使用C ++ 17,但在编辑我的等级时出错。

我试图将向量放在头文件的'setRankPass'函数中,但它根本不起作用。

头文件

#pragma once
#include <vector>

class Score {
public:
    Score(int score)
        : _score{ score } {
    }
    int getScore() {
        return _score;
    }
    int getRank() {
        return _rank;
    }
    bool getPass() {
        return _pass;
    }
    void setRankPass(const std::vector<int>* scores, int size) {
        for (int i{ 0 }; i < size; i++) {
            _rank = rank[i];
        }

        double average = static_cast<double>(_rank) / size * 100;
        if (average <= 10) {
            _pass = true;
        }
        else {
            _pass = false;
        }
    }
private:
    int _score{ 0 };
    int _rank{ 0 };
    bool _pass{ false };
};

cpp文件

#include <iostream>
#include <iomanip>
#include <vector>
#include <algorithm>
#include "Score.h"
using namespace std;
    int main() {
        int enter{ 0 };
        int counter{ 0 };
        vector<Score> v;
        vector<int> s;
        while (enter != -1) {
            cout << "Enter score(-1 to quit): ";
            cin >> enter;
            if (enter == -1)
                break;
            v.push_back(Score(enter));
            counter++;
        }
        int cnt;
        vector<int>rank;
        for (int i = 0; i < v.size(); i++) {
            cnt = 0; 
            for (int j = 0; j < v.size(); j++) {
                if (v[i].getScore() < v[j].getScore()) {
                    cnt++;
                }
            }
            rank.push_back(cnt + 1);
        }
        cout << endl;

        for (int a{ 0 }; a < v.size(); a++) {
            v[a].setRankPass(&rank, counter);
        }

        for (int k{ 0 }; k < v.size(); k++) {
            cout << setw(5) << v[k].getScore() << setw(5) << v[k].getRank() << setw(5) << v[k].getPass() << endl;
        }
        return 0;
    }

我在_rank = rank [i]上有一些错误。是error E0441 There is no argument list for class template "std::rank"Error C2065 'rank': Undeclared identifier。我期望矢量等级的实例将分配给每个_rank。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:5)

在此范围内,您没有rank矢量变量:

void setRankPass(const std::vector<int>* scores, int size) {
    for (int i{ 0 }; i < size; i++) {
        _rank = rank[i];
    }

    double average = static_cast<double>(_rank) / size * 100;
    if (average <= 10) {
        _pass = true;
    }
    else {
        _pass = false;
    }
}

您可以这样调用函数:

for (int a{ 0 }; a < v.size(); a++) {
    v[a].setRankPass(&rank, counter);
}

但是您在serRankPass范围内拥有的变量是分数。我想你打算做这样的事情:

void setRankPass(const std::vector<int> &rank, int size) { // Pay attention to & and not * (reference instead of pointer) 
    _rank = 0; // initialize to 0 and not junk value
    for (int i{ 0 }; i < size; i++) {
        _rank += rank[i]; // += instead of = (add and not overwrite)
    }

    double average = static_cast<double>(_rank) / size * 100;
    if (average <= 10) {
        _pass = true;
    }
    else {
        _pass = false;
    }
}

请注意,在此修复程序之后,您必须在主程序中更改以下行:

v[a].setRankPass(&rank, counter);

此行:

v[a].setRankPass(rank, counter);