Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.07.2015, 17:41   #11
Krasiosoft
Форумчанин
 
Аватар для Krasiosoft
 
Регистрация: 01.06.2015
Сообщений: 497
По умолчанию

Цитата:
Сообщение от Krok27 Посмотреть сообщение
Как тогда вернуть из функции:
Код:
Vita & operator = (const Vita &rhs)
Например, так:
Код:
Vita & operator = (const Vita &rhs)
{
    if (this != &rhs)
    {
        *x = rhs.fvf();
        //*x = *(rhs.x);
    }
    return *this;
}
Если помог, буду очень благодарен за Ваш отзыв (весы в левой нижней части сообщения).
Krasiosoft вне форума Ответить с цитированием
Старый 16.07.2015, 18:20   #12
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

Цитата:
Сообщение от crazy horse Посмотреть сообщение
Код:
*x = rhs.fvf();
Нифига не читабельно.

Код:
               if (this == &rhs) return *this;

		*x = rhs.fvf();

		//*x = *(rhs.x);

		return *this;
Я бы не советовал плодить return'ы на ровном месте.
Код:
if (this != &rhs)
и дальше по тексту.
Это что вообще?

конструктор копий
Код:
cclass(const cclass& _c) { *this = _c; }
оператор
Код:
cclass& operator=(const cclass& _c) 
{ /* тут копируем данные */ }
P.S.

оператор
Код:
/* я возвращаю ссылку, объект не порождается */
cclass& operator=(const cclass& _c) 
{ 
    /* тут копируем данные */
    return *this; /* Возвращаем текущий объект */
}
P.S.
Вы выделяете память под указатель при создании объекта,
что бы избежать проблем при уничтожении объекта,
выделяйте память и при копии
Если помог, тут весы есть , Вам не сложно, а мне приятно.

Последний раз редактировалось Perchik71; 16.07.2015 в 18:26.
Perchik71 вне форума Ответить с цитированием
Старый 17.07.2015, 10:45   #13
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 668
По умолчанию

В норме не стоит переписывать стандартные функции (копирование, перемещение, конструкторы) ведь не зря они предоставляются по умолчанию. Стоит правильно организовывать объект, например:
Код:
#include <vector>
#include <memory>
using namespace std;

struct Data {};

struct Container1  { vector<Data> data; };

struct Container2  { unique_ptr<Data> udata; };

int main()
{
    Container1 c1;
    Container2 c2;

    Container1 copy1 = c1;
    Container2 move2 = move(c2); // c2 более невалиден
}
unique_ptr и vector возьмут на себя все стандартные процедуры (копирование, перемещение, ...). Мы получили тот же указатель, но не паримся о его сопровождении.
Если приходится писать деструктор, то удаляю конструкторы и операторы = (можно написать свои если нужно).
P.S: на shared_ptr также можно посмотреть. В общем копать здесь http://en.cppreference.com/w/cpp/header/memory

Последний раз редактировалось 220Volt; 17.07.2015 в 11:01.
220Volt вне форума Ответить с цитированием
Старый 17.07.2015, 13:02   #14
Helloween
Форумчанин
 
Регистрация: 24.04.2012
Сообщений: 300
По умолчанию

Да вы что?

Стандартный конструктор копирования копирует ПОБАЙТОВО, не вызывая конструкторов копирования vector'a и shared_ptr.

Вот такой код приведет к интересному результату (да и к тому же семантика shared_ptr нарушается):

class A
{
std::shared_ptr<int> x;
public:
void fill()
{
x.reset(new int(10));
}

void new_val()
{
*x = 11;
}

void print()
{
printf("%d", *x);
}
};

int main()
{
A a;
a.fill();
A b = a;
a.new_val();
b.print();
return 0;
}
Помог? Оставляем отзыв =)
Helloween вне форума Ответить с цитированием
Старый 17.07.2015, 13:20   #15
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 668
По умолчанию

Цитата:
Сообщение от Helloween Посмотреть сообщение
Да вы что?

Стандартный конструктор копирования копирует ПОБАЙТОВО, не вызывая конструкторов копирования vector'a и shared_ptr.
Что-то вы меня удивляете, давайте проверим:
Код:
#include <iostream>
using namespace std;

class A
{
public:
    A() = default;
    A(const A&) {cout << "copy constr\n";}
};

struct Cont
{
    A a;
};

int main()
{
    Cont c1;
    Cont c2 = c1;
    return 0;
}
$ ./a.out
copy constr

По вашему примеру: у меня печатает 11, что неправильно?
220Volt вне форума Ответить с цитированием
Старый 17.07.2015, 13:43   #16
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Стандартный конструктор копирования копирует ПОБАЙТОВО, не вызывая конструкторов копирования vector'a и shared_pt
стандартный конструктор копирует по-членно.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 17.07.2015, 14:03   #17
Helloween
Форумчанин
 
Регистрация: 24.04.2012
Сообщений: 300
По умолчанию

Хорошо, с shared_ptr неудачный пример, замените на unique_ptr с тем же кодом.
Помог? Оставляем отзыв =)
Helloween вне форума Ответить с цитированием
Старый 17.07.2015, 14:25   #18
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 668
По умолчанию

Как же можно применить код к unique_ptr, данная логика там не применима. Можно сделать move(a), но не вижу смысла (что это доказывает?).
220Volt вне форума Ответить с цитированием
Старый 17.07.2015, 17:17   #19
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Цитата:
Сообщение от Helloween Посмотреть сообщение
Хорошо, с shared_ptr неудачный пример, замените на unique_ptr с тем же кодом.
А это проблема unique_ptr а не конструктора.
Вот напишите *свой* конструктор, который скопирует unique_ptr.
waleri вне форума Ответить с цитированием
Старый 18.07.2015, 03:35   #20
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

Цитата:
Сообщение от 220Volt Посмотреть сообщение
Как же можно применить код к unique_ptr, данная логика там не применима. Можно сделать move(a), но не вижу смысла (что это доказывает?).
Если класс содержит указатели внутри себя, у вас будут большие проблемы, если Вы не опишите конструктор копий, ровно так же как и деструктор. Проблемы очевидные... Вы не контролируете память, и не можете предсказать поведении объекта, вообще это будет "баг", который аргументируется как Ваша неопытность.

P.S. отказ от указателей? хммм, не помню язык, но такую "фичу" пытались сделать... (кто помнит поправите), привело к тому, что Вы ограничены по потреблению памяти, к тому же, нет возможности динамически влиять на размеры.. списки и массивы итд, можете забыть.
Если помог, тут весы есть , Вам не сложно, а мне приятно.

Последний раз редактировалось Perchik71; 18.07.2015 в 03:41.
Perchik71 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа со стандартным графическим модулем dbrf Помощь студентам 1 18.01.2015 21:56
Вопрос по стандартным контейнерам monnzz Общие вопросы C/C++ 3 31.03.2013 02:55
Графика по стандартным алгоритмам Kovy Помощь студентам 2 23.01.2011 13:08
Вопрос по стандартным фукциям. Klim Bassenger Microsoft Office Excel 4 17.08.2009 20:07
Работа со стандартным help'ом Гришас Помощь студентам 4 21.03.2007 16:07