Как редактировать закрытый член вектора в функции класса? - PullRequest
1 голос
/ 01 июня 2019

Я работал над своей работой, и она должна была вводить некоторые оценки и распечатывать оценки, рейтинги и проходить / не сдавать. Я работал с 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 file

#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 Ответ

5 голосов
/ 01 июня 2019

В этой области нет 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...