Вектор указателей на объекты класса

У меня проблема с пониманием векторов указателей на объекты класса, я попробовал тестовый код, чтобы попытаться понять его, но всякий раз, когда я ввожу имя и пытаюсь его вывести, он печатает числа вместо фактического имени, которое я ввел. Я надеюсь, что кто-то может объяснить это мне, поскольку я новичок в этих концепциях.

Также Pets[0]->print(); вообще не печатать, пока:

cout << "in main: " << Pets[0] << endl; 

отпечатки.

class Pet
{ 
public:
    string name;
    Pet(const string&);

    string getName() const
    {
        return name;
    }
    void setName(const string& Name)
    {
        name = Name;
    }
    void print()const;
}

int main()
{
    vector<Pet*> Pets;
    string names;
    int done = NULL;
    do
    {
        {
            cout << "Name: ";
            cin >> names;
            Pets.push_back(new Pet(names));
            cin.ignore();
        }
        cout << "Add another ?" << endl;
        cin >> done;
    } while (done != 0);

    Pets[0]->print();
    cout << "in main: " << Pets[0] << endl;
    system("pause");
}
Pet::Pet(const string& Name)
{
}
void Pet::print()const
{
    cout << "Name: " << name;
}

@Yksisarvinen std::string имеет конструктор по умолчанию, который создает пустую строку, так что это не UB.

aschepler 07.06.2019 21:52
Pets[0]->print(); печатает, но печатает пустую строку. Вы забыли инициализировать член name в конструкторе вашего класса, поэтому по умолчанию он инициализируется пустой строкой.
TrebledJ 07.06.2019 21:55

@aschepler Ты прав, мой плохой.

Yksisarvinen 07.06.2019 21:57

обратите внимание, что обычно вы бы использовали std::vector<Pet>, то есть без указателей, и полагались бы на вектор, чтобы управлять памятью для вас. В вашем коде у вас есть утечка памяти, потому что все, что newed, также должно быть deleted

463035818_is_not_a_number 07.06.2019 22:04
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
4
72
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Конструктор Pet не присваивает параметр, поэтому он остается пустым.

Напишите...

Pet::Pet(const string& Name) : name(Name) { }

выполнить эту инициализацию.

будет ``` Pet::Pet(const string& Name) { name = Name; } ``` быть одинаковым? почему я должен использовать часть :? и извините, я очень новичок и самоучусь

Luminate 07.06.2019 21:58

@Luminate см. здесь: stackoverflow.com/questions/926752/…

463035818_is_not_a_number 07.06.2019 22:00

В этом случае это было бы практически то же самое; :-обозначение — это инициализация, а name = Name в теле — присваивание. Некоторые вещи, такие как, например, инициализация члена типа const, разрешены только через инициализацию, но не через присваивание. Но, как уже упоминалось, в вашем случае это не имеет большого значения.

Stephan Lechner 07.06.2019 22:01

@Luminate Вы должны либо поместить { this->name = Name; } в тело конструктора, либо поместить : name(Name) в список инициализации членов. Вам решать.

Wyck 07.06.2019 22:03

Большое спасибо, это исправлено. Простая вещь, и я искал ответ в течение часа, когда мог спросить здесь за считанные минуты.

Luminate 07.06.2019 22:05

@Luminate пора научиться пользоваться отладчиком. Это позволяет вам шаг за шагом выполнять код построчно и наблюдать за значениями переменных.

463035818_is_not_a_number 07.06.2019 22:06

@Wyck не нужно this. Имена переменных С++ чувствительны к регистру;)

scohe001 07.06.2019 22:06

@Wyck в списке инициализаторов можно даже сделать Pet(string name) : name(name) {}. нет необходимости вводить новое имя (каламбур), хотя это немного спорно

463035818_is_not_a_number 07.06.2019 22:09

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