如何在类函数中编辑向量的私有成员

How to edit private member of vector in a Class function?

本文关键字:成员 向量 编辑 类函数      更新时间:2023-10-16

我正在做我的工作,就是输入一些分数并打印出分数、排名和通过/失败。我正在使用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。如何解决问题?

此作用域中没有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;
    }
}

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

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

到这一行:

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