c++ - 如何在类函数中编辑向量的私有成员?
问题描述
我正在做我的工作,它是输入一些分数并打印出分数、排名和通过/失败。我正在使用 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);
推荐阅读
- php - 如何通过访问其他表来获取所有被阻止的客户端来获取它
- javascript - 如何在赛普拉斯中获取具有动态选择器的元素
- roblox - 如何在 Roblox 中制作这些“提示”外观的东西?
- apache-spark - 如何在 spark sql (databricks) 中重用创建的列?
- google-apps-script - 在一张谷歌表格中组合四个脚本
- php - 为什么我在 PHP REST-Service 上得到 404
- java - 如何在安卓应用上显示 USB 摄像头
- python-3.x - 如何从 bs4.element.Tag 中获取值
- python - 在对数图中修复 x 轴和 y 轴 python
- javascript - 使用 jQuery 从 2 个不同的来源填充数据表