LINUX.ORG.RU

C++ [part4]


0

0

И снова здраствуйте! Наболел один вопрос по классам :

В конструкторе класса мне нужно сохранить адресс члена в другом члене(оба в секции private).

Это я делаю так : memb1 = &memb2;

Мне показалось что тут ничего такого нет, но как оказалось что не правильно показалось :

Если инициализировать вектор классов то все поля memb2 будут содержать один и тот же адресс(члена memb1 последнего инициализированного класса ).

Объясните пожалуйста в чем заключается моя ошибка?.

anonymous

>мне нужно сохранить адресс члена в другом члене

>Это я делаю так : memb1 = &memb2;

>все поля memb2 будут содержать один и тот же адресс(члена memb1 последнего инициализированного класса ).

Покажите обобщенный примечик, а то не ясно где чего искать

kosmonavt
()
Ответ на: комментарий от kosmonavt

#include <iostream>
#include <vector>

class A
{
    public:
        A(){};
        A( unsigned int &i ) : mem2 ( i ), mem1 ( &mem2 ) {};
        ~A() {};
        void print();
    private:
        void *mem1;
        unsigned int mem2;
};


void A::print()
{
    std::cout << "mem2 = " << mem2 << std::endl;
    int *i = (int *)mem1;
    std::cout << "mem1 = " << *i << std::endl << std::endl;
}

int main ()
{

    std::vector<A> buf;
    unsigned int i = 100;
    while ( --i )
    {
        buf.push_back ( A(i) );
    }
    std::vector<A>::iterator it = buf.begin(), end = buf.end();
    for ( ; it != end ; ++it )
        (*it).print();
    return EXIT_SUCCESS;
}

anonymous
()
Ответ на: комментарий от anonymous

надо добавить конструктор копирования и operator=, чтобы при копировании значение адреса вычислялось сизнова.

Однако зачем хранить объест и его адрес одновременно не совсем ясно

anonymous
()
Ответ на: комментарий от anonymous

Да.

Без перегрузки оператора копирования, происходит побайтное копирование, это как бы копировать объекты вызовом memcpy. Ну и не мешало бы добывить конструктор копирования.

kosmonavt
()
Ответ на: комментарий от anonymous

И на будущее. Для таких случаев лучше хранить в векторе/массиве указатели на объекты.

kosmonavt
()
Ответ на: комментарий от kosmonavt

> Без перегрузки оператора копирования, происходит побайтное копирование

Проиходит вызов operator= для каждого члена класса. А это эквивалентно memcpy только в самом тривиальном случае.

lb
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.