Конструктор не вызывается - PullRequest
0 голосов
/ 16 мая 2019

Я делаю массив из 4 std :: list. Но когда я пытаюсь получить доступ к первому объекту A первого списка массива и вызвать для него метод callMe (), я получаю странный вывод.

Теперь могло произойти 2 вещи:

  1. Либо список был пуст.
  2. Объект был создан, когда я попытался получить доступ к первому элементу первого списка ((* (arrayOflistOfA [0] .begin ()))).

Подробности вышеупомянутых случаев:

  1. Если объект не был создан, я должен был получить исключение. Но я не получил никаких исключений, поэтому я предполагаю, что объект A был создан.
  2. Так что, если объект A действительно был создан, тогда конструктор должен был быть вызван.

Что мне не хватает?

#include <iostream>
using namespace std;
class A {
public:
    A() {
        cout<<"Constructor called"<<endl;
        x=20;
    }
    void callMe();
private:
    int x;
};

void A::callMe() {
    cout<<"Value of x = "<<x<<endl;
}

int main() {
    const int size = 4;
    list<A>* arrayOflistOfA = new list<A>[size];
    (*(arrayOflistOfA[0].begin())).callMe();
}

Вывод:

Value of x = 0

но результат должен был быть:

Constructor called
Value of x = 20

Ответы [ 3 ]

1 голос
/ 21 мая 2019

Если объект A не был создан, я должен получить исключение.

Не верно.

Но я не получил никаких исключений, поэтому я предполагаю, что объект A был создан.

Не предполагать . Узнайте. Перейдите к некоторой документации для begin() и для итераторов и обнаружите, что вы не получите исключение, вы получите UB .

Объект был создан, когда я попытался получить доступ к первому элементу первого списка ((*(arrayOflistOfA[0].begin()))). [И] если объект A действительно был создан, то конструктор должен был быть вызван.

Это верно. Очевидно, у вас нет элементов в списке.

И мы знаем это, потому что в вашей программе нет кода, который добавляет элементы в список .

Кроме того, вы не должны динамически распределять контейнеры, если вам это действительно не нужно (я никогда не обнаруживал в этом необходимости).

1 голос
/ 16 мая 2019

Вы фактически не заполняете список какими-либо значениями.Я протестировал приведенный ниже код и включил закомментированное объяснение.

#include <iostream>
#include <list>
using namespace std;
class A {
public:
    A();
    void callMe();
private:
    int x = 0;
};

A::A()
{
    cout << "Constructor called" << endl;
    x = 20;
}

void A::callMe() {
    cout << "Value of x = " << x << endl;
}

int main() {
    const int size = 4;
    list<A>* arrayOflistOfA = new list<A>[size];
    cout << arrayOflistOfA->size() << endl; // As you can see, size is 0 here - you created a list of nulls.

    for (int i = 0; i < size; i++)
    {
        arrayOflistOfA->push_back(A());
    }

    // The below code demonstrates how to loop through the array once it's populated.
    list<A>::iterator it;
    for (auto& a : *arrayOflistOfA)
    {
        a.callMe();
    }
    return 0;
}
0 голосов
/ 21 мая 2019

Я получил ответ на свой вопрос. Сначала я попытался запустить этот код на своем Mac с помощью компилятора GNU C ++, но когда я запустил тот же код на симуляторе iPhone, он завис. Поэтому, как упоминал @PaulMcKenzie, я действительно пытался разыменовать недействительный итератор.

...