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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.04.2019, 07:26   #1
taras-proger77
Заблокирован
 
Регистрация: 17.12.2018
Сообщений: 514
По умолчанию Прошу замечания

Код:
#include <new>
#include <iostream>
class TItem
{
 public:
  int a;
  int b;
  int c;
  int d;
};
class TArray
{
 private:
  TItem *Data;
 public:
  class TManipulator
  {
   private:
    friend class TArray;
    TItem *Data;
    TManipulator (TItem *Data)
    {
     this->Data=Data;
    }
   public:
    TManipulator ()
    {
     Data=nullptr;
    }
    TManipulator (const TManipulator &Original)
    {
     Data=Original.Data;
    }
    TManipulator & operator = (const TManipulator &Original)
    {
     if (this!=(&Original))
     {
      Data=Original.Data;
     }
     return *this;
    }
    bool operator == (const TManipulator &Compared) const
    {
     return Data==Compared.Data;
    }
    bool operator != (const TManipulator &Compared) const
    {
     return Data!=Compared.Data;
    }
    TItem & operator * ()
    {
     return *Data;
    }
    TItem * operator -> ()
    {
     return Data;
    }
    operator bool ()
    {
     return Data!=nullptr;
    }
  };
  TArray()
  {
   Data=new (std::nothrow) TItem [1024];
  }
  ~TArray()
  {
   if (Data!=nullptr)
   {
    delete [] Data;
   }
  }
  TManipulator Item(size_t Index)
  {
   TItem *Result;
   if (Data!=nullptr)
   { 
    if (Index<1024)
    {
     Result=Data+Index;
    }
   }
   return Result;
  }
};
int main()
{
 TArray a;
 size_t i;
 char c;
 TArray::TManipulator m;
 do
 {
  std::cout<<"index="; std::cin>>i;
  m=a.Item(i);
  if (m)
  {
   std::cout<<"a["<<i<<"].a="; std::cin>>m->a;
   std::cout<<"a["<<i<<"].b="; std::cin>>m->b;
   std::cout<<"a["<<i<<"].c="; std::cin>>(*m).c;
   std::cout<<"a["<<i<<"].d="; std::cin>>(*m).d;
  }
  else
  {
   std::cout<<"a["<<i<<"] does not exist"<<std::endl;
  }
  std::cout<<"index="; std::cin>>i;
  m=a.Item(i);
  if (m)
  {
   std::cout<<"a["<<i<<"].a="<<m->a<<std::endl;
   std::cout<<"a["<<i<<"].b="<<m->b<<std::endl;
   std::cout<<"a["<<i<<"].c="<<(*m).c<<std::endl;
   std::cout<<"a["<<i<<"].d="<<(*m).d<<std::endl;
  }
  else
  {
   std::cout<<"a["<<i<<"] does not exist"<<std::endl;
  }
  std::cout<<"repeat?"; std::cin>>c;
 } while ((c=='y')||(c=='Y'));
 return 0;
}
Надо ли запрещать
Код:
TImem *p;
p=&(*m);
? Есть ли другие ошибки? Для перебора TArray::TManipulator не предназначен.

Последний раз редактировалось taras-proger77; 23.04.2019 в 06:38.
taras-proger77 вне форума Ответить с цитированием
Старый 22.04.2019, 08:02   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Что это за код?...
POD обычно делают структурами.
Обычно "итератор" используют для досткпа в контейнер, а не наоборот.
При присваивании надо проверять, что нет самоприсваивания.
delete переваривает nullptr
Вы возвращаете указатель на TItem, хотя функция говорит, что на TManipulator и нет конструктора.
= и == разные операторы, делающие разные вещи.
На современных компиляторах ретурн 0 в конце не обязателен.

Последний раз редактировалось p51x; 22.04.2019 в 08:06.
p51x вне форума Ответить с цитированием
Старый 22.04.2019, 18:53   #3
taras-proger77
Заблокирован
 
Регистрация: 17.12.2018
Сообщений: 514
По умолчанию

Что такое POD?
Это не иттератор. Класс TManipulator не предназначен для перебора.
Что здесь наоборот? Есть контейнер. Для доступа к нему ничего лишнего не надо. В контейнере лежат элементы. Для доступа к ним есть манипулятор. Функция Item возвращает манипулятор. Можно было бы вернуть ссылку. Но тогда при выходе за пределы массива софтина упадёт сразу. А так я могу проверить, что вернула функция. В данном случае для простоты сделан массив. В настоящем же классе для доступа используется не индекс, а некое подобие первичного ключа (но реляцией не пахнет) и проверить существование элемента, сравнив параметр возвращающей манипулятор функции с количеством элементов не получится, а сами значения «ключа» поставляет система, так что упростить их валидацию я не могу. Какое возможно решение? Вызвать сначала IsExist и сразу Find? Ага, и дважды искать по всему контейнеру. Настоящее внутренне представление – список. А так один перебор и по его результату можно проверить, найден ли элемент с таким значением «ключа». А если найден, то тогда уже обращаться к нему.
Цитата:
delete переваривает nullptr
Вот только
Цитата:
delete m;
не компилится и указателю манипулятор не присваивается, так что об удалении несуществующего элемента через манипулятор беспокоиться не стоит точно также, как и об удалении существующего.
Цитата:
При присваивании надо проверять, что нет самоприсваивания.
Что самое смешное, в настоящих классах это сделано, а в примере забыто. Спасибо, буду внимательней.
Цитата:
Вы возвращаете указатель на TItem, хотя функция говорит, что на TManipulator и нет конструктора.
Есть:
Код:
TManipulator (TItem *Data)
{
 this->Data=Data;
}
. И это отражено в данном примере.
Цитата:
Сообщение от p51x Посмотреть сообщение
На современных компиляторах ретурн 0 в конце не обязателен.
Так читабельней.
Цитата:
= и == разные операторы, делающие разные вещи.
Так они и есть разные. Что не так?

Последний раз редактировалось taras-proger77; 22.04.2019 в 19:00.
taras-proger77 вне форума Ответить с цитированием
Старый 22.04.2019, 19:20   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
Сообщение от taras-proger77 Посмотреть сообщение
Что такое POD?
Гугл и вики вас забанили?

Цитата:
Сообщение от taras-proger77 Посмотреть сообщение
Это не иттератор. Класс TManipulator не предназначен для перебора.
Я его специально для вас взял в "".

Цитата:
Сообщение от taras-proger77 Посмотреть сообщение
Функция Item возвращает манипулятор. Можно было бы вернуть ссылку. Но тогда при выходе за пределы массива софтина упадёт сразу. А так я могу проверить, что вернула функция.
Т.е. на самом деле фиговый, малофункциональный и т.д. объект, вместо std::shared_ptr.

Цитата:
Сообщение от taras-proger77 Посмотреть сообщение
не компилится и указателю манипулятор не присваивается
Что за бред? m у вас стековый обеъкт, какой ему нуллптр и делит? какой указатель?

Цитата:
Сообщение от taras-proger77 Посмотреть сообщение
И это отражено в данном примере.
Проглядел в приватах.

Цитата:
Сообщение от taras-proger77 Посмотреть сообщение
Так они и есть разные. Что не так?
Код:
while ((c='y')||(c='Y'));
p51x вне форума Ответить с цитированием
Старый 23.04.2019, 06:13   #5
taras-proger77
Заблокирован
 
Регистрация: 17.12.2018
Сообщений: 514
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Гугл и вики вас забанили?
Тогда какое отношение «христианская» рок-группа имеет к программированию?
taras-proger77 вне форума Ответить с цитированием
Старый 23.04.2019, 06:38   #6
taras-proger77
Заблокирован
 
Регистрация: 17.12.2018
Сообщений: 514
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Т.е. на самом деле фиговый, малофункциональный и т.д. объект, вместо std::shared_ptr.
Как раз не держит объект и не требует его отдельно освобождать, а делает только то, для чего предназначен без каких-то лишних операций, как и положено по идеологии c/c++ , в отличие от антифункционального std::shared_ptr. Мне нужен безопасный доступ к связанным с дескриптором окна данным при обработке отдельно взятого сообщения, независимо от того, успели ли они создаться или удалиться до этого сообщения, при этом я не хочу всё складывать в cbWndExtra. Во-первых потому что данных будет много, а во-вторых туда ещё вложен другой динамический контейнер, который будет индексироваться, но для единобезобразия сделан также на манипуляторе вместо ссылки, и внутри него будут ещё три динамических объекта, два из которых будут и индексироваться, и ключеваться координатными парами, между которыми будет пусто. А по
Код:
DefWindowProc(Window, Message, First, Second);
объект просто бросается без лишней возни. И, наоборот, объект не удалится сам, пока в этом не возникнет необходимость. При необходимости же его удалить специального вызывается функция, ни как с манипулятором не связанная. Причём, если пользователь закрывает окно мышью, то объект удаляется по вызову из WM_CLOSE, а если удаляется объект, то деструктор прибивает окно. Связь получается двойная, но её логика естественна, а std::shared_ptr противоположна.
Цитата:
Сообщение от p51x Посмотреть сообщение
Что за бред? m у вас стековый обеъкт
Он-то стековый, а связан с кучей. Не забывайте, что в нём лежит указатель.
Цитата:
Сообщение от p51x Посмотреть сообщение
while ((c='y')||(c='Y'));
Спасибо. Первый раз такой глюк пропустил.
taras-proger77 вне форума Ответить с цитированием
Старый 23.04.2019, 06:41   #7
taras-proger77
Заблокирован
 
Регистрация: 17.12.2018
Сообщений: 514
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
какой ему нуллптр и делит?
А откуда ж ещё может опасность
Код:
delete nullptr;
хоть мерещиться, не то что исходить?
taras-proger77 вне форума Ответить с цитированием
Старый 23.04.2019, 08:13   #8
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

Цитата:
Сообщение от taras-proger77 Посмотреть сообщение
Тогда какое отношение «христианская» рок-группа имеет к программированию?
Продолжайте строить из себя идиота... https://en.wikipedia.org/wiki/Passive_data_structure

Цитата:
Сообщение от taras-proger77 Посмотреть сообщение
Как раз не держит объект и не требует его отдельно освобождать, а делает только то, для чего предназначен без каких-то лишних операций, как и положено по идеологии c/c++ , в отличие от антифункционального std::shared_ptr.
Берите std:ptional. У меня уже третью тему дежавю.

Цитата:
Сообщение от taras-proger77 Посмотреть сообщение
Мне нужен
Т.е. вы сделали кривую архитектуру, не продумали взаимосвязи и пытаетесь натянуть что-то на что-то.
Берете меп и с ключом хендл окна и окну передаете адрес контейнера, оно по хендлу все берет.

Цитата:
Сообщение от taras-proger77 Посмотреть сообщение
Он-то стековый, а связан с кучей. Не забывайте, что в нём лежит указатель.
Да хоть ядерная бомба там лежит. делит применяется для указателей, работает в паре с нью... Что лежит внутри - забота деструктора.

Цитата:
Сообщение от taras-proger77 Посмотреть сообщение
А откуда ж ещё может опасность
Какая опасность?

Такое ощущение, что вы пришли на форум, чтобы вам сказали, что вы все сделали правильно и плевать вам на все остальное. Могли бы маме показать со словами "смотри я сделаль".
p51x вне форума Ответить с цитированием
Старый 23.04.2019, 11:56   #9
taras-proger77
Заблокирован
 
Регистрация: 17.12.2018
Сообщений: 514
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Продолжайте строить из себя идиота... https://en.wikipedia.org/wiki/Passive_data_structure
Вот только аббревиатурой от этого будет PDS, а не POD. Потому гугл и нашёл не её, а https://ru.wikipedia.org/wiki/P.O.D.
taras-proger77 вне форума Ответить с цитированием
Старый 23.04.2019, 12:01   #10
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,695
По умолчанию

https://en.wikipedia.org/wiki/POD
Цитата:
Computers
...
Plain old data in computing, data distinct from an object
https://en.wikipedia.org/wiki/Passive_data_structure
Цитата:
In computer science and object-oriented programming, a passive data structure (PDS, also termed a plain old data structure, or plain old data, POD)
Продолжайте...
p51x вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Алгоритмы. Не прошу решить. Прошу помочь! pascaluser Паскаль, Turbo Pascal, PascalABC.NET 2 12.10.2012 08:45
Замечания к структуре БД artemavd БД в Delphi 13 01.05.2009 19:40
Замечания к структуре БД artemavd БД в Delphi 0 30.04.2009 13:01