инкремент static переменной
От: Аноним  
Дата: 06.09.06 11:41
Оценка:
есть код

class Temp
{
    static int counter;
    int x;
public:
    Temp(int x_ = 0)
    {
        ++counter;
        x = x_;
    }

    /*interface*/
    void printCounter();
};

int Temp::counter = 0;

void Temp::printCounter()
{
    cout<<counter<<" ";
}

void outPrint(Temp &p)
{
    p.printCounter();
}

int _tmain(int argc, _TCHAR* argv[])
{
    vector <Temp> v;
    v.resize(5);
    for_each(v.begin(), v.end(), outPrint);
    return 0;
}


результат неожиданный:
1 1 1 1 1 Press any key to continue

по определению resize заполняет вектор объектами созданными конструтором по умолчанию, но тогда не понятно почему такой результат, please help
Re: инкремент static переменной
От: Аноним  
Дата: 06.09.06 11:54
Оценка:
Здравствуйте, Аноним, Вы писали:


А>по определению resize заполняет вектор объектами созданными конструтором по умолчанию, но тогда не понятно почему такой результат, please help


На самом же деле, заполняется только первый элемент вектора для всех остальных происходит copy созданного объекта.
Re: инкремент static переменной
От: korzhik Россия  
Дата: 06.09.06 12:06
Оценка:
Здравствуйте, Аноним, Вы писали:

А>результат неожиданный:

А>1 1 1 1 1 Press any key to continue

А>по определению resize заполняет вектор объектами созданными конструтором по умолчанию, но тогда не понятно почему такой результат, please help


потому что resize() использует копирующий конструктор
Re: инкремент static переменной
От: Roman Odaisky Украина  
Дата: 06.09.06 16:34
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>по определению resize заполняет вектор объектами созданными конструтором по умолчанию, но тогда не понятно почему такой результат, please help


Потому что void resize(size_type, T const& = T()). Второй аргумент наводит на мысли? Он нужен для того, чтобы ограничить требования к типу T. Если тип не DefaultConstructible, то можно сунуть туда свой «начальный» экземпляр. Если же его опустить, то вызовется дефолтный конструктор (если последнего нет — облом), и созданный объект будет скопирован N раз в массив.

Поставь ++counter в конструктор копий
Автор: CEMb
Дата: 25.05.06
и радуйся жизни.

P. S. Используй const, они рулят.
До последнего не верил в пирамиду Лебедева.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.