У меня есть присвоение C ++, в котором мы должны реализовать некоторые классы, которые наследуются от ABC с именем Object. Каждый объект имеет определенный идентификатор.
У нас есть класс String (для его реализации используется std :: string), который является объектом Object и будет использоваться вместо std :: string.
Также у нас есть ABC PlaneComponent, который является Объектом и имеет дата-столбец «Описание строки».
Другим классом является PassengerCompartment, который является PlaneComponent и имеет элемент данных, который является указателем на другой PassengerCompartment (например, внутренний PassengerCompartment).
У нас есть функция "клон", которая возвращает объект * клонированному объекту.
Я создаю объект PassengerCompartment под названием «test» в main и Object * ptr и клонирую объект «test».
Затем я проверил, равны ли эти объекты (PassengerCompartments) и получил «не равный», что не правильно.
Поэтому я начал проверять равные функции.
Проблема в том, что когда я вызываю String :: equal и в его теле я получаю следующую команду:
cout << ((String*)other_object)->get_string() << endl;
(get_string () - это метод доступа к std :: string класса String, возвращающий std :: string)
У меня есть ошибка:
Program received signal SIGSEGV, Segmentation fault.
0xb76e2d88 in std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string () from /usr/lib/libstdc++.so.6
Это вывод bt full в gdb:
(gdb) bt full
#0 0xb767ed88 in std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string () from /usr/lib/libstdc++.so.6
No symbol table info available.
#1 0x0804bb10 in String::get_string (this=0xbfdb5560) at objects.h:55
No locals.
#2 0x0804b2de in String::equal (this=0xbfdb5568, other_object=0xbfdb5560) at objects.cpp:129
No locals.
#3 0x0804b5a5 in PlaneComponent::equal (this=0xbfdb5560, other_object=0xbfdb5560) at objects.cpp:191
No locals.
#4 0x0804ba3a in PassengerCompartment::equal (this=0xbfdb5560, other_object=0xbfdb5560) at objects.cpp:372
result = false
#5 0x080492b4 in main () at main.cpp:47
anew = {<Object> = {_vptr.Object = 0x804c008, id = 1}, the_string = {static npos = 4294967295,
_M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>}, _M_p = 0x804f014 "A Class"}}}
test = {<PlaneComponent> = {<Object> = {_vptr.Object = 0x804bfc8, id = 2}, description = {<Object> = {_vptr.Object = 0x804c008, id = 1},
the_string = {static npos = 4294967295,
_M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>},
_M_p = 0x804f014 "A Class"}}}}, inner_PassengerCompartment = 0x0}
ptr = (class Object *) 0x804f020
И это вывод valgrind:
==14233== Bad permissions for mapped region at address 0x804C004
==14233== at 0x40CFD88: std::string::string(std::string const&) (in /usr/lib/libstdc++.so.6.0.9)
==14233== by 0x804BB0F: String::get_string() (objects.h:55)
==14233== by 0x804B2DD: String::equal(Object const*) (objects.cpp:129)
==14233== by 0x804B5A4: PlaneComponent::equal(Object const*) (objects.cpp:191)
==14233== by 0x804BA39: PassengerCompartment::equal(Object const*) (objects.cpp:372)
==14233== by 0x80492B3: main (main.cpp:47)
В String :: equal (Object * other_object), в GDB я получаю это:
(gdb) print *this
$1 = {<Object> = {_vptr.Object = 0x804bfa8, id = 1}, the_string = {static npos = 4294967295,
_M_dataplus = {<std::allocator<char>> = {<__gnu_cxx::new_allocator<char>> = {<No data fields>}, <No data fields>}, _M_p = 0x804f014 "A Class"}}}
(gdb) print *other_object
$2 = {_vptr.Object = 0x804bf68, id = 2}
Итак, на мой взгляд, Object * ptr - это всего лишь объект, а не PassengerCompartment.
Так проблема в функции клона? (в этой функции "Object * PassengerCompartment :: clone (void)" у меня есть это:
return new PassengerCompartment(*this);
Что я делаю не так? Я действительно не могу понять это. Может быть, конструкторы копирования?
Пожалуйста, скажите мне, какую другую информацию вы хотели бы, чтобы я включил!
Заранее спасибо за помощь!
Некоторые дополнительные заметки:
Object * Object :: clone () является чисто виртуальным.
Это код равных функций и конструкторов копирования
Это исходные файлы в соответствии с запросом ||| Зеркало здесь