Я только начинаю изучать С++, и я хотел бы получить доступ и изменить вектор объектов, которые имеют разные типы переменных. Я смог только создать вектор, но ничего не могу с ним сделать. Как я могу получить доступ и изменить его? Это код, который я создал до сих пор:
class Person {
private: string name; int id;
public:
Person(string x, int y) { name = x; id = y; };
~Person();
};
int main()
{
vector<vector<Person>> v4;
}
Так что мне придется создать вектор для каждой переменной или, возможно, создать структуру? - @n.'местоимения'm.
Для доступа к объектам, хранящимся в векторе, у вас есть различные операторы и методы, такие как at()
или operator[]
. Для получения более подробной информации проверьте https://www.cplusplus.com/reference/vector/vector/
Поскольку вы хотите изучать C++, я предполагаю, что вы не знаете, о чем именно спрашивать, поэтому позвольте мне помочь вам.
В вашем примере кода отсутствуют другие вещи, помимо доступа к объектам в векторе:
name
и id
являются частными, вы не можете получить к ним доступ.std::pair
, или вам нужно работать с интерфейсами и наследованием.Позвольте мне построить что-то, чтобы дать вам подсказку, где продолжить:
#include <iostream>
#include <string>
#include <vector>
class Person {
private:
std::string name;
int id;
public:
Person(std::string x, int y) { name = x; id = y; };
// ~Person(); //This is not needed, since your class currently does not need any special handling during destruction
// You need to be able to access name and id to be able to do something with them, for example print it
std::string getName() const {
// be aware that this creates a copy of name. Thus changes to the returned string will not be reflected in the Person object.
// Another option would be returning a reference (std::string&), but that I leave for you to research yourself
return name;
}
int getId() const {
// same as for the name applies
return id;
}
// This allows us to change the id of a Person
void setId(int newId) {
id = newId;
}
};
int main()
{
// Lets create a Person first:
Person p ("John", 1); // Please note that the string literal here will be used to construct an std::string on the fly and then store it in name of p
// Create a second Person:
Person p2 ("Jim", 2);
// Create a vector and add the persons to it
std::vector<Person> v;
v.push_back(p);
v.push_back(p2);
// Print out the contents of the vector
for (auto& pers : v) {
std::cout << "Person " << pers.getName() << " has id " << pers.getId() << std::endl;
}
// Now change the id of the second person in the vector to 5 (note that indexes start at 0)
v.at(1).setId(5);
// Print again
for (auto& pers : v) {
std::cout << "Person " << pers.getName() << " has id " << pers.getId() << std::endl;
}
}
Чтобы поиграть с ним: https://godbolt.org/z/8dfEoa
Я надеюсь, что это поможет вам начать работу.
TBH, я знал о функциях set/get (но не о реализации деструктора) и о том, что один вектор может содержать разные типы. Просто я не мог получить к ним доступ/изменить, поэтому я представил потенциальное решение этого вектора векторов. Но вы правы, это действительно ставит меня на правильный путь. Спасибо.
Кстати. не путайте объекты и типы. Объект - это экземпляр определенного типа, например. Person
— это тип, а p
и p1
— объекты этого типа. Вектор может содержать множество объектов, но все они должны иметь один и тот же тип.
Кстати, может ли вектор базы класса содержать объект базы производного класса?
Да, это возможно. Если у вас есть class Base
и class Derived : public Base
, вы можете создать vector<Base>
и добавить к нему объекты типа Base
и Derived
. Имейте в виду, что если вы извлекаете объекты, они будут типа Base
, поэтому у вас будет доступен только интерфейс Base
. Если вы хотите работать с чем-то, доступным только в Derived
, вы можете работать с dynamic_cast<Derived*>(...)
Подробнее см. en.cppreference.com/w/cpp/language/dynamic_cast
Вектор не может содержать разные типы переменных.