@m1kz

Почему объект класса из вектора некорректно выполняет функцию класса?

Я создал вектор, в котором 2 объекта класса и отдельно просто объект класса. Но почему-то векторные объекты не работают с функциями и переменными так как надо, а при попытке, лишь флудят в консоль при выводе, вызывают неприятные звуки ошибки и зависания. Когда обычный объект работает как надо.

Листинг:
#include <iostream>
#include <vector>
#include <Windows.h>
using namespace std;

class Animal
{
	string name = " ";
	string sex = " ";
	string age = " ";


public:

	void set(string n, string s, string a)
	{
		name = n;
		sex = s;
		age = a;

	}
	void const print() {
		cout << "Животное " << name << endl << "Пол " << sex << endl << "Возраст " << age << endl;

	}
};


int main()
{
	SetConsoleCP(1251);
	SetConsoleOutputCP(1251);
	setlocale(LC_ALL, "Russian");

	vector <Animal> animals;
	animals.reserve(2);
	string a;
	Animal cat;

	cout << typeid(cat).name() << endl << typeid(animals[0]).name() << endl; // одинаковый тип обьектов

	cat.print();
	animals[0].print(); //не работает корректно, добавьте комментарий на эту строку чтобы увидеть как все должно работать

}
  • Вопрос задан
  • 106 просмотров
Решения вопроса 1
Наверное есть больше вариаций. Предложу три.

1) Добавление объекта в контейнер(вектор) с помощью метода контейнера(push_back) и вызова конструктора при создании объекта который будет инициализировать поля.
2) Создание объекта, вызов метода set и добавления объекта в вектор при помощи метода контейнера(push_back, insert, etc).

Здесь демо двух вариаций:
#include <iostream>
#include <vector>
#include <Windows.h>
using namespace std;

class Animal {

	string name;
	string gender;
	int age;

public:
	
	// Default constructor
	Animal() {
		name = "";
		gender = "";
		age = 0;
	}
	
	// Constructor which can be called when creating an object
	Animal(string n, string g, int a) {
		name = n;
		gender = g;
		age = a;
	}

	void set(string n, string g, int a) {
		name = n;
		gender = g;
		age = a;
	}
	
	void const print() {
		cout << "Животное: " << name << endl << "Пол: " << gender << endl << "Возраст: " << age << endl;
	}
};


int main() {
	SetConsoleCP(1251);
	SetConsoleOutputCP(1251);
	setlocale(LC_ALL, "Russian");
	
	/* Creating a vector container and adding an object by calling the constructor of the Animal class and calling the container-vector method */
	vector <Animal> animals;
	animals.push_back(Animal("dog", "male", 3));
	
	// Creating an object and calling the set method
	Animal cat;
	cat.set("cat", "male", 1);
	animals.push_back(cat);
	
	// Content of vector
	for(auto animal: animals) {
	   animal.print();
	   cout << "" << endl;
	}
	
	return 0;
}

Третий вариант, вектор определенной длины(трех объектов как вариация).
#include <iostream>
#include <vector>
#include <Windows.h>
using namespace std;

class Animal {

	string name;
	string gender;
	int age;

public:
	
	// Default constructor
	Animal() {
		name = "";
		gender = "";
		age = 0;
	}

	void set(string n, string g, int a) {
		name = n;
		gender = g;
		age = a;
	}
	
	void const print() {
		cout << "Животное: " << name << endl << "Пол: " << gender << endl << "Возраст: " << age << endl;
	}
};


int main() {
	SetConsoleCP(1251);
	SetConsoleOutputCP(1251);
	setlocale(LC_ALL, "Russian");
	
	vector <Animal> animals(3);
	animals[0].set("dog", "male", 3);
	animals[1].set("cat", "male", 1);
	animals[2].set("pig", "female", 5);
	
	// Content of vector
	for(auto animal: animals) {
	   animal.print();
	   cout << "" << endl;
	}
	
	return 0;
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
vabka
@vabka
Токсичный шарпист
Вы только зарезервировали место в векторе, но в нём данных нет.
Нужно добавить в него экземпляр класса
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы