crossplatform.ru

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


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

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

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


Последние 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 Текстовая версия Сейчас: 29.3.2024, 16:10