Нужен ли конструктор копирования для изменения статического члена при push_back в вектор? - PullRequest
0 голосов
/ 22 марта 2019

Представьте себе следующий класс:

class test
{
private:
static int counter;
//some stuff
public:
test() {++counter;};
~test() {--counter;};
};

Моя проблема заключается в следующем: если я push_back в векторе:

std::vector<test> tests;
tests.push_back(test());

В этот момент я хочу, чтобы мой счетчик пометил1 так как у меня в общей сложности создано 1 элемент.Проблема в том, что он отмечает 0.

Я предполагаю, что я создаю объект, затем копирую его в вектор, а затем объект уничтожается.

Есть ли у меня другой вариант, кромесоздать конструктор копирования?

Ответы [ 2 ]

0 голосов
/ 22 марта 2019

Я сделал маленький трюк с твоим кодом

class test
{
    private:
    static int counter;
    //some stuff
    public:
    test() {
        ++counter;
        cout<<"constructor "<<endl;
    }
    ~test() {
        --counter;
        cout<<"Destructors"<<endl;
    }
};

int test::counter = 0;

int main(void) 
{ 
    std::vector<test> tests;
    tests.push_back(test());
    cout<<tests[0].counter<<endl;
    return 0;
}

вывод:

constructor 
Destructors
0
Destructors
  1. создать тестовый объект (++ 0 = 1)
  2. вектор копирует ссылки на предыдущие объекты
  3. vector удаляет созданный им объект (--1 = 0)
  4. счетчик печати
  5. оригинальный объект удален

Это вызов Конструктор мелкой копии

0 голосов
/ 22 марта 2019

Счетчик должен соответствовать количеству объектов, которые ваша программа имеет в любой момент времени.Каждое разрушение уменьшает количество объектов, и поэтому существует --counter.Кроме того, каждый конструктор создает еще один объект, увеличивая общее количество объектов, поэтому каждый конструктор должен иметь ++counter.

Конструктор копирования (по умолчанию или нет) создает новый объект.Очевидно, вы должны убедиться, что конструктор копирования имеет ++counter.Для этого вы должны реализовать конструктор копирования.

Если вы не определили этот конструктор копирования, то push_back запускает конструктор копирования, создавая новый объект.Но с конструктором копирования по умолчанию счетчик остается без изменений.В конце концов, временное значение, которое передается в push_back, удаляется, и счетчик становится 0, несмотря на наличие объекта в векторе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...