Есть ли способ уйти, преодолеть разбиение объектов без использования нового ключевого слова в качестве параметра для функции? У меня есть базовый объектСпособ преодоления обрезки объектов
class Person{
public:
Person(string name , int age){
this -> name = name;
this -> age = age;
}
virtual void getInfo(){
cout << "Person " << name << " " << age;
}
void add(string name , Person a){
Person *one = new Person(a);
m[ name ] = one;
}
void print(){
for(auto &x: m)
x.second -> getInfo()
}
protected:
string name;
int age;
map< string , Person*> m;
};
результирующие объекты
class Kid : public Person{
public:
Kid(string name, int age):Person(name,age){};
virtual void getInfo(){
cout << "Kid " << name << " " << age;
}
};
class Adult : public Person{
public:
Adult(string name, int age):Person(name,age){};
virtual void getInfo(){
cout << "Adult " << name << " " << age;
}
};
и пытается вызвать его, такие как
Person one("John", 25);
one.add("first",Kid("Mathew",15));
one.add("second",Adult("Leo",55));
one.print();
Из объекта нарезка печатает
«Человек .. . "
Я попытался использовать unique_ptr
и получил тот же результат. я пытался объявить copy function
, такие как
vitual clone() const{ return new Person(*this);}
в базе Clase
и в производных классов я объявил
Kid* clone() const{ return new Kid(*this);}
Adult* clone() const{ return new Adult(*this);}
и отредактированную функцию добавления.
void add(string name , Person a){
Person *one = a.clone();
m[ name ] = one;
}
И я все еще был поражен объективом slicind. Я пробовал различные вещи/подходы/методы, и все это привело к разделению объектов.
Есть ли способ, как создать такую вещь (карту, которая содержит derivec классов базового класса) без использования new
ключевого слова в аргументе функции
Person one("bla",5);
one.add("asd", new Kid("one",15))
Спасибо за помощь.
// Текущее состояние кода
class Person{
public:
Person(string name , int age){
this -> name = name;
this -> age = age;
}
virtual void getInfo(){
cout << "Person " << name << " " << age;
}
void add(string name , const Person &a){
Person *one = a.clone();
m[ name ] = one;
}
void print(){
for(auto &x: m){
x.second -> getInfo();
cout << endl;
}
}
virtual Person* clone() const{ return new Person(*this);}
protected:
string name;
int age;
map< string , Person*> m;
};
class Kid : public Person{
public:
Kid(string name, int age):Person(name,age){};
virtual void getInfo(){
cout << "Kid " << name << " " << age;
}
Kid* clone() const{ return new Kid(*this);}
};
class Adult : public Person{
public:
Adult(string name, int age):Person(name,age){};
virtual void getInfo(){
cout << "Adult " << name << " " << age;
}
Adult* clone() const{ return new Adult(*this);}
};
int main(){
Person one("John", 25);
one.add("first",Kid("Mathew",15));
one.add("second",Adult("Leo",55));
one.print();
}
что вы имеете в виду «используя новое ключевое слово в качестве В параметре функционировать» ?? Если вы хотите избежать нарезки объектов, просто передайте указатель или ссылку .... – user463035818
Не могли бы вы показать пример? Я пытался заставить его работать в течение нескольких часов n, и я пробовал передавать ссылку и указатель без успеха – Darlyn