Как в C++ создать контейнер с пользовательским типом?

не получается сделать контейнер с пользовательским типом данных.

#include "pch.h"
#include <iostream>
#include <string>
#include <vector>
using namespace std;

class Student
{
private:
    string name;
    int age;    
public:
    Student(string Name, int Age) { name = Name; age = Age; }
    friend std::ostream& operator<< (std::ostream &out, const Student &point);
};

std::ostream& operator<< (std::ostream &out, const Student &point)
{
    out <<  point.name << ", " << to_string(point.age) << endl ;
    return out;
}

int main()
{
    setlocale(LC_ALL, "Russian");

    vector<Student> v(3);
    int i;
    v[0] = Student("Иванов", 45.9);
    v[1] = Student("Петров", 30.4);
    v[2] = Student("Сидоров", 55.6);

    cout << v[1];

Ответы (2 шт):

Автор решения: KoVadim

Давайте разберем.

Так как Вы хотите изменить размер вектора через resize(3), нужно добавить конструктор по умолчанию. Где то такой

Student() : name{""}, age{0} {}

Но можно использовать push_bach/emplace_back.

Также, возможно не хочет компилится, потому что в v[0] = Student("Иванов", 45.9); Вы передаете вещественное число, а сам возраст собственно целое. Надо согласовать.

Мой поправленный вариант

#include <iostream>
#include <string>
#include <vector>
using namespace std;

class Student
{
private:
    string name;
    int age;    
public:
    Student(string Name, int Age) { name = Name; age = Age; }
    friend std::ostream& operator<< (std::ostream &out, const Student &point);
};

std::ostream& operator<< (std::ostream &out, const Student &point)
{
    out <<  point.name << ", " << to_string(point.age) << endl ;
    return out;
}

int main()
{
    setlocale(LC_ALL, "Russian");

    vector<Student> v;
    v.emplace_back("Иванов", 45);
    v.emplace_back("Петров", 30);
    v.emplace_back("Сидоров", 55);


    cout << v[1];

}
→ Ссылка
Автор решения: AlexGlebe

Вам нужен в классе конструктор по умолчанию.

Вы создаёте временный объект, а оператора присваивания от временного объекта в классе нет.

Возраст вы храните как целое число, а надо с точкой. Поменяйте тип age.

Так напишите:

  float age ;
public:
  Student():name{},age{}{}
  Student & operator=(Student && s) 
    {name=std::move(s.name);age=std::move(s.age);
      return * this;      }
→ Ссылка