#c #class
#c #класс
Вопрос:
Я действительно не знал, что поставить в качестве названия для этого, так что не обращайте на это внимания. Я также не знаю, как описать этот вопрос, так что вот моя проблема.
#include lt;iostreamgt; #include lt;vectorgt; class ClassB { public: //LOOK AT THIS PART int value; char letter; ClassB(char t, int v) { letter = t; value = v; } }; class ClassA { private: ClassB* ptr; public: ClassA(ClassB n) { ptr = amp;n; } ClassB* getPtr(){ return ptr; } }; int main() { std::vectorlt;ClassAgt; objects; for(int i=0;ilt;4;i ) { objects.push_back(ClassA(ClassB('a',i))); } std::cout lt;lt; "Value: " lt;lt; objects[1].getPtr()-gt;value lt;lt; std::endl; std::cout lt;lt; "Letter: " lt;lt; objects[1].getPtr()-gt;letter; return 0; }
В этом коде вывод, который я должен получить, выглядит так
Value: 1 Letter: a
Однако я получаю это
Value: 1 Letter
Кроме того, если бы я объявил букву перед значением (посмотрите на комментарий в коде), то на выходе было бы написано
Value: 0 Letter: ☺
Я не уверен, почему порядок, в котором я их объявляю, повлияет на что-либо, или почему у меня вместо лица появляется улыбающееся лицо. Любая помощь приветствуется, спасибо!
Комментарии:
1. У вас неопределенное поведение, потому что здесь:
ClassA(ClassB n) { ptr = amp;n; }
указатель указывает на локальный объект, который затем выходит за рамки.2. Объект, переданный
ClassA
конструктору, также является временным. Вы сохраняете указатели на объекты, не задумываясь о времени жизни этих объектов.
Ответ №1:
Проблема заключается в следующем:
ClassA(ClassB n) { ptr = amp;n; }
ClassB-это временная переменная, которая уничтожается в конце функции. Указатель становится недействительным, и программа сходит с ума.
Простой и безопасный способ сделать это-использовать std::unique_ptr и передать параметры. unique_ptr автоматически удалит ClassB при удалении ClassA:
private: std::unique_ptrlt;ClassBgt; ptr; public: ClassA(char t, int v) { ptr = std::make_uniquelt;ClassBgt;(t, v); }
Там также просто сохраняется значение вместо указателя.
Комментарии:
1. Я бы сказал, что
n
это локальная переменная.ClassB
не является переменной, и переменная, которую вы описываете, не является «временной» в традиционном понимании этого слова.