crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в Создание неограниченного количества элементов
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
Теги
Выровнять по центру
Ссылка на тему
Ссылка на сообщение
Скрытый текст
Сокращение
Код с подсветкой
Offtopic
 
Удалить форматирование
Спец. элементы
Шрифт
Размер
 
Цвет шрифта
 
Отменить ввод
Вернуть ввод
Полужирный
Курсив
Подчеркнутый
 
 
Смайлики
Вставить изображение
Вставить адрес электронной почты
Цитата
Код
Раскрывающийся текст
 
Увеличить отступ
По левому краю
По центру
По правому краю
Вставить список
Вставить список

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
Алексей1153 Дата 13.8.2010, 21:07
  Я не собирался отдельно объявлять переменные класса s_VectorPtr<T> , всем этим заведует сам вектор (структура s_VectorPtr, кстати, в проекте, откуда выдрано, описана как приватная внутри класса с вектором)

Теперь я понимаю твоё возмущение, а также , почему у меня всё работает, хотя, по стандарту, не должно :) Я реализовал и использовал частный случай
DEADHUNT Дата 13.8.2010, 20:57
  получается так:
X<T> b = ...;
X<T> a(b); // b - передаёт указатель a

std::vector<X<T>> v;
v.push_back(a); // a - разрушается
v.front(); // разрушается объект в векторе


и ещё непонятно зачем operator= принимает константную ссылку, а внутре изменяет содержимое константного объекта, лучше было бы в параметре использовать не константную ссылку.
Алексей1153 Дата 13.8.2010, 20:49
  DEADHUNT, так так, тут вот поподробнее. Почему разрушающее? Я копирую указатель в новую оболочку, а сам "указуемый" объект жив.

Это вот в операторе = у меня заменяемый объект отправляется в кучу, а принимаемый его заменяет

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

Я главную цель всей этой эпопеи не сказал (думал, и так понятно) - безопасное использование resize() контейнера + автоудаление "указуемых" объектов в кучу
DEADHUNT Дата 13.8.2010, 20:38
 
Цитата(Алексей1153 @ 13.8.2010, 21:26) *
то есть мне нужно добавить

это же разрушающее копирование получается(если ещё посмотреть код operator=), т.е. что-то типа std::auto_ptr, а их нельзя в контейнерах использовать, надо что-то типа shared_ptr делать, то есть хранить количество ссылок на указатель, ...
Алексей1153 Дата 13.8.2010, 20:26
  понятно

то есть мне нужно добавить
        s_VectorPtr(const s_VectorPtr& o2)
        {
            m_p=0;
            (*this)=o2;
        }
DEADHUNT Дата 13.8.2010, 19:27
 
Цитата(DEADHUNT @ 13.8.2010, 17:47) *
Синтаксис я тоже не понял :) что означает "= delete" и "= default" после прототипа функции?

= delete/default применяется только к специальным членам класса(конструктор, конструктор копирования, ...), delete обозначает то что компилятор не должен генерировать default версию этого специального члена класса, а при попытке вызова выдавать ошибку компиляции(это равносильно объявиления данного члена закрытым и не реализовывать). default показывает компилятору что он должен создать default версию данного члена, например:
class some_class {
public:
   some_class() = default;
   some_class(int a) : m_a(a) { }
private:
   int m_a;
};

some_class a;
some_class a(10);

иначе бы компилятор не стал создавать конструктор по умолчанию.
Алексей1153 Дата 13.8.2010, 17:54
  Синтаксис я тоже не понял :) что означает "= delete" и "= default" после прототипа функции?
Litkevich Yuriy Дата 13.8.2010, 17:33
  DEADHUNT, не мог бы ты пояснить такую строчку:
Цитата(DEADHUNT @ 13.8.2010, 20:47) *
smart_ptr(const smart_ptr &) = delete;
?
DEADHUNT Дата 13.8.2010, 16:47
  http://open-std.org/JTC1/SC22/WG21/docs/pa.../2010/n3090.pdf

насчёт работы это как раз из-за твоего зануления указателя в деструкторе, потому-что деструктор вызывается несколько раз вместо одного, попробуй сделать так в своём классе:
class smart_ptr {
    smart_ptr(const smart_ptr &);
....
};

или так
class smart_ptr {
    smart_ptr(const smart_ptr &) = delete;
....
};

и увидешь где используется конструктор копирования.
Алексей1153 Дата 13.8.2010, 16:08
  а где сей стандарт глядеть?

А насчёт корректности работы - оно работает, одного только оператора присваивания достаточно. Правда, у меня в проекте std::vector используется, но работает без ошибок - очень хорошо и длительно тестировано :)
Просмотр темы полностью (откроется в новом окне)
RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 17.7.2025, 20:31