#c #oop #visual-studio-debugging
Вопрос:
Я хочу создать
array
класс для автотуризма, ввести некоторые значения и отобразить массив. VS выдает мне ошибку отладки (имя в заголовке). Этот код работает с кодом VS, но в VS я работал с файлами заголовков для класса.пс. Я отредактировал код, потому что пытался исправить его, применив Правило 3, но это дает мне ту же ошибку отладки. Это домашнее задание, и я должен использовать
char*
переменные, а такжеarray
для автотуризма. Также я буду признателен , если кто-нибудь сможет объяснить мне, почему существуетAutoturism(const char* s, unsigned int an, std::size_t n)
inprivate
и что делаетaccessor
(operator const char* () const { return culoare; }
). Тх !!*
#includelt;iostreamgt; #includelt;stringgt; #includelt;cstringgt; #includelt;cstddefgt; class Autoturism { static int nr_autoturisme; // nr_autoturisme 'active' char* culoare; //raw pointer unsigned int an_fabricatie; Autoturism(const char* s, unsigned int an, std::size_t n) // to avoid counting twice ??? :culoare(new char[n]), an_fabricatie(an) // alocate { std::memcpy(culoare, s, n); // populate } public: Autoturism(const char* = "", unsigned int = 0); ~Autoturism(); Autoturism(const Autoturismamp;); Autoturismamp; operator = (const Autoturismamp; other); operator const char* () const { return culoare; } // accessor ??? static int return_nr_auto(); void citire(); void afisare() const; void schimb_culoare(); void comparare_an_fab(const Autoturism); void citire_array(size_tamp;); void afisare_array(size_t); void afisare_auto_nou(size_t); }; int Autoturism::nr_autoturisme{ 0 }; Autoturism::Autoturism(const char* c, unsigned int an) : Autoturism(c, an, std::strlen(c) 1) { nr_autoturisme; std::cout lt;lt; "nConstructorul a fost apelat !"; } Autoturism::~Autoturism() { std::cout lt;lt; "nDestructorul a fost apelat !"; delete [] culoare; --nr_autoturisme; } Autoturism::Autoturism(const Autoturismamp; copy) :Autoturism(copy.culoare, copy.an_fabricatie) { nr_autoturisme; // adaugat si la copiere pt ca oricum va se apela destruct, dar nu se mai scade din cele 'active' std::cout lt;lt; "nConstructorul copy a fost apelat !"; } Autoturismamp; Autoturism::operator = (const Autoturismamp; other) { if (this == amp;other) return *this; std::size_t n{ std::strlen(other.culoare) 1 }; char* new_culoare = new char[n]; std::memcpy(new_culoare, other.culoare, n); delete[] culoare; // ??? culoare = new_culoare; std::cout lt;lt; "nCopy Assignment a fost folosit !"; return *this; } int Autoturism::return_nr_auto() { return nr_autoturisme; } void afisare_nr_auto() { std::cout lt;lt; "nNr de auto 'active' este : " lt;lt; Autoturism::return_nr_auto(); } void Autoturism::citire() { std::cout lt;lt; "ntCuloare: "; std::cin gt;gt; culoare; std::cout lt;lt; "ntAn fabricare: "; std::cin gt;gt; an_fabricatie; } void Autoturism::afisare() const { std::cout lt;lt; std::endl; std::cout lt;lt; culoare lt;lt; " " lt;lt; an_fabricatie; } void Autoturism::schimb_culoare() { char* ch{ nullptr }; ch = new char[10]; std::cout lt;lt; "nCuloarea pe care vreti sa o adaugati : "; std::cin gt;gt; ch; this-gt;culoare = new char[strlen(ch) 1]; this-gt;culoare = ch; } void Autoturism::comparare_an_fab(const Autoturism a) { this-gt;an_fabricatie gt; a.an_fabricatie ? std::cout lt;lt; "nAnul de fabricare pt obiectul caruia ii se atribuie metoda, este mai mare decat obiectului de comparat !" : std::cout lt;lt; "nAnul de fabricare pt obiectul caruia ii se atribuie metoda, este mai mic decat obiectului de comparat !"; } void Autoturism::citire_array(size_t amp;n) { std::cout lt;lt; "nCitire nr de obc de tip Autoturim: "; std::cin gt;gt; n; for (size_t i{ 0 }; i lt; n; i) this[i].citire(); } void Autoturism::afisare_array(size_t n) { for (size_t i{ 0 }; i lt; n; i) this[i].afisare(); } void Autoturism::afisare_auto_nou(size_t n) { std::cout lt;lt; "nCel main nou autoturism este: "; this[n - 1].afisare(); } int main() { Autoturism a[10]; size_t n{0}; a-gt;citire_array(n); a-gt;afisare_array(n); return 0; }
Комментарии:
1. Определите тип, который не зависит от того, является ли он элементом массива. Если вам нужна их коллекция, сделайте это за пределами класса.
2. Когда вы дойдете до
citire
этого ,culoare
элемент неинициализирован, поэтомуstd::cin gt;gt; culoare
имеет неопределенное поведение. Кроме того, все элементы массива уничтожаются, в том числе и те, которыеculoare
не являются чем-то значимым.