вчера вечером на мой вопрос о векторном сопряжении был дан ответ 🙂
Однако у меня новая проблема. В моем случае у меня есть метод toString (), объявленный в моем классе следующим образом.
string toString() {
stringstream info;
info << "Name : " << getName() << "\nSubject: " << getSubject() << "\nResult : " << getGrade() << endl << endl;
return info.str();
}
Далее у меня есть вектор и код для печати следующим образом:
vector<pair<Student*, string>> Students;
//...
Students.push_back(make_pair(Abbie, Abbie->getGrade(80)));
//...
for (int i = 0; i < Students.size(); i++)
{
cout << Students[i]->toString() << endl;
}
Видимо, оценка не фиксируется и не печатается.
Разве я не должен вести себя таким образом, если у меня есть toString ()? Если нет, могу ли я знать, как мне это сделать?
Кто-нибудь может помочь? 🙂
Изменить: я нашел свой источник ошибки — я назначил значения, используя «==» вместо «=». Но тем не менее, спасибо всем за попытку помочь
Похоже
Abbie->getGrade(80)
просто конвертирует int в строку, не присваивая никаких данных объекту. Если так, то здесь:
Students.push_back(make_pair(Abbie,Abbie->getGrade(80)));
Ваша оценка оценивается только в pair.second, но не в самой Abbie, поэтому при печати информации о классе не печатается значение
Abbie->getGrade(80)
Если toString()
Метод определен, как вы упомянули, тогда в классе Student должны быть члены «name, subject и grade», поэтому класс должен выглядеть примерно так:
class Student
{
public:
Student(std::string name_, std::string subject_, std::string grade_) // Let's just use string everywhere to keep the example simple
: name(name_)
, subject(subject_)
, grade(grade_)
{}
std::string getName() { return name; }
std::string getSubject() { return subject; }
std::string getGrade() { return grade; }
std::string toString();
private:
std::string name;
std::string subject;
std::string grade;
}
Теперь, когда вы создаете «Abbie», вы должны сделать это со всей необходимой информацией:
Student * Abbie = new Student("Abbie", "Math", "80");
Остальная часть вашего кода должна работать сейчас, но я хотел бы отметить пару вещей:
Вам действительно не нужен вектор пар, если Student
У класса есть метод, который возвращает все его члены:
vector<Student*> Students;
Students.push_back(Abbie);
for (int i = 0; i < Students.size(); i++)
{
cout << Students[i]->toString() << endl; // Now you can use this without the "first" I mentioned in a comment up there
}
Еще одна вещь, toString()
метод принадлежит Student
класс, поэтому он имеет доступ к своим собственным членам, поэтому не нужно вызывать геттеры для получения значений:
std::string toString()
{
stringstream info;
info << "Name : " << name << "\nSubject: " << subject << "\nResult : " << grade << endl << endl;
return info.str();
}
НОТА: Однако это должно работать и распечатать все правильно, используя toString()
, заголовок вашего вопроса был «Печать пары из вектора». Если это действительно то, что вам нужно объяснить, вы должны сделать это как Дилан Джеймс Макганнон сказал вам в комментарии.