У меня проблема с пониманием векторов указателей на объекты класса, я попробовал тестовый код, чтобы попытаться понять его, но всякий раз, когда я ввожу имя и пытаюсь его вывести, он печатает числа вместо фактического имени, которое я ввел. Я надеюсь, что кто-то может объяснить это мне, поскольку я новичок в этих концепциях.
Также
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;
}
Pets[0]->print(); печатает, но печатает пустую строку. Вы забыли инициализировать член name в конструкторе вашего класса, поэтому по умолчанию он инициализируется пустой строкой.
@aschepler Ты прав, мой плохой.
обратите внимание, что обычно вы бы использовали std::vector<Pet>, то есть без указателей, и полагались бы на вектор, чтобы управлять памятью для вас. В вашем коде у вас есть утечка памяти, потому что все, что newed, также должно быть deleted





Конструктор Pet не присваивает параметр, поэтому он остается пустым.
Напишите...
Pet::Pet(const string& Name) : name(Name) { }
выполнить эту инициализацию.
будет ``` Pet::Pet(const string& Name) { name = Name; } ``` быть одинаковым? почему я должен использовать часть :? и извините, я очень новичок и самоучусь
@Luminate см. здесь: stackoverflow.com/questions/926752/…
В этом случае это было бы практически то же самое; :-обозначение — это инициализация, а name = Name в теле — присваивание. Некоторые вещи, такие как, например, инициализация члена типа const, разрешены только через инициализацию, но не через присваивание. Но, как уже упоминалось, в вашем случае это не имеет большого значения.
@Luminate Вы должны либо поместить { this->name = Name; } в тело конструктора, либо поместить : name(Name) в список инициализации членов. Вам решать.
Большое спасибо, это исправлено. Простая вещь, и я искал ответ в течение часа, когда мог спросить здесь за считанные минуты.
@Luminate пора научиться пользоваться отладчиком. Это позволяет вам шаг за шагом выполнять код построчно и наблюдать за значениями переменных.
@Wyck не нужно this. Имена переменных С++ чувствительны к регистру;)
@Wyck в списке инициализаторов можно даже сделать Pet(string name) : name(name) {}. нет необходимости вводить новое имя (каламбур), хотя это немного спорно
@Yksisarvinen
std::stringимеет конструктор по умолчанию, который создает пустую строку, так что это не UB.