Доступ и изменение вектора C++, содержащего объекты с различными типами переменных

Я только начинаю изучать С++, и я хотел бы получить доступ и изменить вектор объектов, которые имеют разные типы переменных. Я смог только создать вектор, но ничего не могу с ним сделать. Как я могу получить доступ и изменить его? Это код, который я создал до сих пор:

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. 12.12.2020 22:10

Так что мне придется создать вектор для каждой переменной или, возможно, создать структуру? - @n.'местоимения'm.

Adato 12.12.2020 23:09
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
97
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Для доступа к объектам, хранящимся в векторе, у вас есть различные операторы и методы, такие как 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 (но не о реализации деструктора) и о том, что один вектор может содержать разные типы. Просто я не мог получить к ним доступ/изменить, поэтому я представил потенциальное решение этого вектора векторов. Но вы правы, это действительно ставит меня на правильный путь. Спасибо.

Adato 13.12.2020 00:25

Кстати. не путайте объекты и типы. Объект - это экземпляр определенного типа, например. Person — это тип, а p и p1 — объекты этого типа. Вектор может содержать множество объектов, но все они должны иметь один и тот же тип.

Rene Oschmann 13.12.2020 01:07

Кстати, может ли вектор базы класса содержать объект базы производного класса?

Adato 13.12.2020 01:48

Да, это возможно. Если у вас есть class Base и class Derived : public Base, вы можете создать vector<Base> и добавить к нему объекты типа Base и Derived. Имейте в виду, что если вы извлекаете объекты, они будут типа Base, поэтому у вас будет доступен только интерфейс Base. Если вы хотите работать с чем-то, доступным только в Derived, вы можете работать с dynamic_cast<Derived*>(...) Подробнее см. en.cppreference.com/w/cpp/language/dynamic_cast

Rene Oschmann 13.12.2020 13:26

Другие вопросы по теме