Отправляет email-рассылки с помощью сервиса Sendsay

Программирование. Форум !!!

(CMyObject ) a = (CMyObject *) b

ДОпустим есть:
CMyObject a, *b;
b = new CMyObject;
Как сделать что то типа(сам знаю что такое не работает, потому и
говорю что "типа")

delete (*)a;
a = *b;
изврат, да?
А зато как бы было все замечательно.......

--
Дедка mailto:geg***@y*****.ru
На муки творчетства подвиг Винамп тем что даже и не запущен
Номер выпуска : 2685
Возраст листа : 184 (дней)
Количество подписчиков : 375
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/110764
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: mailto:comp.soft.prog.prog--unsub@subscribe.ru

http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Wed, 24 Mar 2004 11:27:34 +0300 (#110764)

 

Ответы:

Здравствуйте,Дедка.

Сформулируй вопрос

Ответить   Болюба Георгий Wed, 24 Mar 2004 13:10:57 +0300 (#110772)

 

Есть статическая переменная
CMyObject a;
есть указатель
CMyObject *b = new CMyObject;

приводим _a_ к указателю на ссылающемуся на область памяти объекта _а_

удаляем _а_

присвамиваем указателю _а_ содержимое _b_

Ферштейн?


--
Дедка mailto:geg***@y*****.ru
На муки творчетства подвиг Винамп тем что даже и не запущен
Номер выпуска : 2701
Возраст листа : 185 (дней)
Количество подписчиков : 377
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/112023
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: mailto:comp.soft.prog.prog--unsub@subscribe.ru

http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Thu, 25 Mar 2004 17:45:05 +0300 (#112023)

 

Здравствуйте, Дедка.

Не уверен.

может быть можно так:
a = *(b);
b = &a;

Т.е. останется переменная статическая, а не динамическая :)

Из всего сказанного Вами мне не понятно, как Вы себе представляете
приведение "_a_ к указателю на ссылающемуся на область памяти объекта
_а_"???

Если я правильно все понимаю, подобная операция попытается привести
саму переменную _а_ к указателю ссылающемуся на область памяти объекта
_а_.

Говоря проще, _а_ не есть переменная, а лишь имя области в памяти.
Это имя существует в момент компиляции в пространстве имен, но не в
коде, который получится.

Ферштейн?

Ответить   Болюба Георгий Fri, 26 Mar 2004 10:34:06 +0300 (#112315)

 

А я не представляю, потому и спрашивал.

да, мне был интересно узнать, что такое невозмножно

О, я-я.


--
Дедка mailto:geg***@y*****.ru
На муки творчетства подвиг Винамп тем что даже и не запущен
Номер выпуска : 2752
Возраст листа : 192 (дней)
Количество подписчиков : 380
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/116480
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: mailto:comp.soft.prog.prog--unsub@subscribe.ru

http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Wed, 31 Mar 2004 18:30:42 +0400 (#116480)

 

Здрсте!
Еще раз сорри!
А если использовать не приведение переменной к указателю, но считать
указатель сразу.
К сожалению не силен в С/С++ но в делфи предстовляю процесс так
var
a1:CMyClass;
a:pointer;
b:^CMyClass;
После обработки
P:=@a1;
a1.free;
b:=a;
алес

С уважением monah
e-mail : janal***@n*****.ru
сайт : http:\\janalex.narod.ru
--
Номер выпуска : 2754
Возраст листа : 192 (дней)
Количество подписчиков : 380
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/116570
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: mailto:comp.soft.prog.prog--unsub@subscribe.ru

http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Thu, 1 Apr 2004 21:31:16 +0700 (#116570)

 

Hello Дедка,

Wednesday, March 31, 2004, 6:30:42 PM, you wrote:

Вот как это на уровне Ассемблера:

CMyObject a;

в стеке создается область памяти для структуры a типа CMyObject.
Делается это просто: sub esp, sizeof(CMyObject)
(стек растет вниз, потому и вычитание). Итак, в стеке есть область в N
байт для структуры (т.е. класса) a.

CMyObject *b = new CMyObject();

В стеке создается 4-байтовая переменная b, далее вызывается функция
выделения памяти (оператор new) которая выделяет в куче память в
размере N+M байт, где M - служебная память для организации списка
выделенных блоков памяти. Там же хранится размер блока для того чтобы
его можно было потом освободить и выделить кому-нибудь еще. Указатель
на первый байт выделенной области записывается в b.

Обращение к a осуществляется прямой ссылкой на память в стеке,
например a.x = 100 выглядит так:

mov dword ptr[offset(a)+offset(CMyObject::x)], 100

причем [offset(a)+offset(CMyObject::x)] реально выглядит как что-то
типа [esp+0x08]
Обращение b->x = 100 выглядит примерно так:

mov edi, b
mov dword ptr[edi+offset(CMyObject::x)], 100

Откуда вывод: приведение переменной a к указателю требует ПРЯМОЙ
МОДИФИКАЦИИ КОДА ТОЙ ФУНКЦИИ где объявлена переменная a; причем
модифицировать нужно код ВСЕХ обращений к a, заменяя смещение
относительно esp на смещение относительно регистра, хранящего адрес
динамически созданного объекта; это даже на асме сложно, не то что на
С++. Поэтому и нет такой прикольной возможности.

Удаление a как динамической области памяти возможно, но приведет к
тому, что программа выполнит недопустимую операцию и будет закрыта :)
Т.к. по адресам &a-4, &a-8 и т.д. с точки зрения delete хранится
служебная информация, а реально там локальные переменные, аргументы
функции или даже ардес возврата из функции, то все это добро будет
затерто нафиг. Кстати, желающие могут поэкспериментировать с подменой
точек возврата из функций :)

Ответить   Fri, 2 Apr 2004 00:31:54 +0400 (#116774)

 

что "типа")

Мудришь, однако. Было совсем непонятно, что тебе нужно в конечном
счете и что было бы замечательно.

Ну и путаница. По пунктам.
1. если нужно получить адрес области памяти, используешь "&a".
2. delete используется для удаления объектов, память для
которых выделена new, само собой, передавать
delete адрес "a" неверно

Теперь попробую предположить, что ты хочешь. Если тебе нужно
завести одну переменную, которая могла бы хранить адрес
объектов, память для которых выделена динамически
или статически, возможно такое решение.
Заводишь в классе признак динамического выделения и делаешь
специальную функцию для освобождения объекта, которая
вызывает "delete this" для динамически
выделенных объектов:

CMyObject::CMyObject(int flag) { m_dyn = flag; }
void CMyObject::Free(void) { if(m_dyn) delete this; }

CMyObject a(0), *b, *x;
b = new CMyObject(1);
x = &a;

x = b;

...
// в конце области существования "a" вызовется деструктор для него

Если я опять тебя не понял, извини. Попробуй
выражать свои пожелания яснее.

--
Номер выпуска : 2709
Возраст листа : 186 (дней)
Количество подписчиков : 378
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/112467
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: mailto:comp.soft.prog.prog--unsub@subscribe.ru

http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Fri, 26 Mar 2004 10:21:50 +0300 (#112467)

 

угу

так конечно можно.. но я хотел не этого, а того что я хотел не бывает.

Да вроде правильно...
Это просто я такой фантазер..
--
Дедка mailto:geg***@y*****.ru
На муки творчетства подвиг Винамп тем что даже и не запущен
Номер выпуска : 2751
Возраст листа : 192 (дней)
Количество подписчиков : 380
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/116479
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: mailto:comp.soft.prog.prog--unsub@subscribe.ru

http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Wed, 31 Mar 2004 18:33:29 +0400 (#116479)

 

Что значит по человечиски *b, (*)a...?

С уважением monah
e-mail : janal***@n*****.ru
сайт : http:\\janalex.narod.ru
--
Номер выпуска : 2689
Возраст листа : 184 (дней)
Количество подписчиков : 375
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/111095
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: mailto:comp.soft.prog.prog--unsub@subscribe.ru

http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Wed, 24 Mar 2004 22:11:46 +0600 (#111095)

 

Здравствуйте !

...

Может быть, ссылки подойдут ?

CMyObject *b;
b = new CMyObject;
CMyObject &a = *b;

Кстати, к классах MFC код :

delete this;

встречается довольно часто :-)

--
С уважением, Вахтуров Виктор.
Информационный сайт для программистов http://SoftMaker.com.ru
Номер выпуска : 2690
Возраст листа : 184 (дней)
Количество подписчиков : 375
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/111224
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: mailto:comp.soft.prog.prog--unsub@subscribe.ru

http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Wed, 24 Mar 2004 22:13:15 +0300 (#111224)

 

ссылки, конечно, подойдут.
Но нужно именно так.

--
Дедка mailto:geg***@y*****.ru
На муки творчетства подвиг Винамп тем что даже и не запущен
Номер выпуска : 2700
Возраст листа : 185 (дней)
Количество подписчиков : 377
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/112021
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: mailto:comp.soft.prog.prog--unsub@subscribe.ru

http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Thu, 25 Mar 2004 17:39:50 +0300 (#112021)

 

* == (*)== (CMyObject *) == работаем как с указателем.

--
Дедка mailto:geg***@y*****.ru
На муки творчетства подвиг Винамп тем что даже и не запущен
Номер выпуска : 2699
Возраст листа : 185 (дней)
Количество подписчиков : 377
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/112020
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: mailto:comp.soft.prog.prog--unsub@subscribe.ru

http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Thu, 25 Mar 2004 17:40:57 +0300 (#112020)

 

Hello Дедка,

Wednesday, March 24, 2004, 11:27:34 AM, you wrote:

Я понял что ты хочешь... конструктор копирования. delete (*a) не
пройдет, т.к. переменная статическая, вторая строчка пройдет
нормально.

Ответить   Thu, 25 Mar 2004 01:08:18 +0300 (#111354)

 

точно?

вот-вот... я тоже сомневался, но надеялся, что как-нить это все-таки
можно.

Пройти она может в случае, если у нас в классе есть функция = такая,
то есть просто все скопируется из b
А надо что бы мы обращаясь к a, на самом деле обращались к b


--
Дедка mailto:geg***@y*****.ru
На муки творчетства подвиг Винамп тем что даже и не запущен
Номер выпуска : 2701
Возраст листа : 185 (дней)
Количество подписчиков : 377
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/112022
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: mailto:comp.soft.prog.prog--unsub@subscribe.ru

http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Thu, 25 Mar 2004 17:47:49 +0300 (#112022)

 

Здравствуйте, Дедка.

Вы писали 24 марта 2004 г., 10:27:34:

Думаю, что ты не совсем понимаешь поведение компилятора при
компиляции подобных выражений.
Между статическими переменными и динамическими есть кординальное
различие:
Статические переменные создаються автоматически как только попадают в
область видимости (наприм. запускается функция её содержащая). Причём
создаёться такая переменная как правило в стеке. Удалять её нельзя.
Присваивать ей другие значения можно только копированием в неё данных.
Выражение delete (*)a Абсолютная бессмыслица. Объект а удалиться
только после выхода из зоны видимости, либо ты напишешь небезопасный
код на Асме. И, если ты удалишь всё таки её, то при выходе объекта из
зоны видимости (возврат из проццедуры содержащей a) произойдёт
исключение, связанное с тем, что стек будет меньше чем полагал
компилятор.
Выражение a = *b (утверждать не буду) но вроде сработает только если
переопределишь в классе CMyObject оператор =. Ведь тут необходимо
переместить все данные (физически) из области на которую указывает b в
переменную а (в стек).

А динамические переменные храняться в куче (спец. обл. памяти).

А вобще это делается с помощью двух указателей. Зачем там статическая
переменная?...

Ответить   Fri, 26 Mar 2004 08:02:33 +0200 (#112278)

 

я так понял, что нужно удалить содержимое a (по сути вызвать
деструктор) и создать новое содержимое на основе b. Т.е. копирование
данных из одного обеъкта в другой. дальнейшее будет основываться
на этой догадке :)

Yurij прав на все 100%. delete (*a) полная бессмыслица.
Основываясь на догадке, предположу, что это такой способ вызова
деструктора, чтобы "очистить" объект. В общем-то не очень понятно
зачем оно нужно, если идея состоит в копировании объектов. Всё равно
при (полном!) копировании все данные заменятся.

Со вторым выражением есть варианты.
1) в классе MyObject не выделяется память из кучи для данных.
В это случае a=*b сработает на ура без лишних телодвижений.

2) в классе MyObject выделяется память из кучи. например под массивы.
a=*b тоже сработает :) правда все указатели, смотрящие в кучу, будут
смотреть на один и тот же адрес. что в a, что в b. После удаления
объекта b, при попытке доступа к массиву из a, получаем ошибку.
Для таких классов нужно писать методы копирования. Как минимум нужен
конструктор копирования. А для удобства и какой-либо явный метод
(переопределённый оператор "=" или простой метод, например copy()),
чтобы копировать уже существующие объекты.

В свете вышесказанного и так все шоколадно ;)

Ответить   Ivan Mikheikin Tue, 30 Mar 2004 01:09:23 +0400 (#114610)

 

Нет, так придется делать, а хотелось просто привести _a_ к указателю,
как указатель ее удалить, а указатель указать на содержимое _b_
А потом опять привести ее к объекту CMyObject.
Я же сразу написал что изврат, зато красиво и просто.
Хотя кто-то и поспорит.

Ну посколько так делать нельзя... то придется так..

Нет, это не шоколадно.
Это горохно.


--
Дедка mailto:geg***@y*****.ru
На муки творчетства подвиг Винамп тем что даже и не запущен
Номер выпуска : 2748
Возраст листа : 192 (дней)
Количество подписчиков : 380
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/116476
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: mailto:comp.soft.prog.prog--unsub@subscribe.ru

http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Wed, 31 Mar 2004 18:29:09 +0400 (#116476)

 

Потому что она уже давно так описана, и пол-проекта ее пользует.
Если б было все так просто, я бы и не жужжал. 8-)


--
Дедка mailto:geg***@y*****.ru
На муки творчетства подвиг Винамп тем что даже и не запущен
Номер выпуска : 2750
Возраст листа : 192 (дней)
Количество подписчиков : 380
Адрес в архиве : http://subscribe.ru/archive/comp.soft.prog.prog/msg/116478
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: mailto:comp.soft.prog.prog--unsub@subscribe.ru

http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Wed, 31 Mar 2004 18:25:06 +0400 (#116478)