Копирование содержимого из одного указателя в другой - PullRequest
1 голос
/ 01 марта 2012

у меня 2 класса:

    class Request
    {
      KeyValuePair* dimension;
    };

    class Response
    {
      KeyValuePair* dimension;
    };

    class KeyValuePair
    {
        public:
        hash_map<string, string> hmap;
    };

в одном из методов я хочу заполнить Response.dimension Request.dimension, но я хочу, чтобы Request.dimension указывал на адрес, отличный от Response.dimension?

Я не хочу никаких изменений Response.dimension, которые также влияют на Request.dimension.

Есть ли способ сделать это?

void Transformation::applyTransformations(const Request& req, Response& res)
{
   res.dimension = req.dimension; // WRONG. Pointing the same address.
}

Ответы [ 5 ]

2 голосов
/ 01 марта 2012

Да, конечно:

*(res.dimension) = *(req.dimension);

Обратите внимание, что если KeyValuePair не является типом POD, вы должны определить оператор присваивания (operator =), поскольку он будет вызываться во время присваивания.Если вы этого не сделаете, будет сгенерирован компилятор.

Вы также должны проверить, правильно ли размещен res.dimension, если нет, используйте конструктор копирования:

if ( res.dimension )
   *(res.dimension) = *(req.dimension);
else
   res.dimension = new KeyValuePair(*(req.dimension));
1 голос
/ 01 марта 2012

Вы можете перегрузить оператор = вашего класса Response, чтобы выполнить глубокое копирование request.dimension, это сделает ваше Response.dimension таким же значением, как значение Request.dimension, и все же будет независимым от любые изменения Request.dimension.

0 голосов
/ 01 марта 2012

Вы можете реализовать указатель ' copy on write ', чтобы избежать ненужных накладных расходов.

0 голосов
/ 01 марта 2012

Вам необходимо выделить новую память.Также вам необходимо иметь конструктор копирования (или использовать конструктор по умолчанию, если это необходимо).

res.dimension = new KeyValuePair(req.dimension);

Также вам придется обрабатывать память, т.е. определять конструктор копирования, оператор копирования, пустойконструктор и деструктор.

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