Одновременно работает только одна переменная, и это зависит от того, в каком порядке я их объявляю

#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 не является переменной, и переменная, которую вы описываете, не является «временной» в традиционном понимании этого слова.