Russian Qt Forum
Ноябрь 23, 2024, 16:55 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: указатели или сами объекты...  (Прочитано 13995 раз)
IzoLda
Гость
« : Февраль 28, 2012, 06:47 »

есть экземпляр класса который имеет подобъекты такого же типа...объект и его подобъекты заполнены соответствующими данными,параметрами.чтобы обращаться именно к данным этого объекта мне необходимо в функцию передавать указатели на соответствующие объекты?а если передать сам объект,то не будет ли он с ним работать как с отдельным, независящим от других объектом???по ходу я не совсем понимаю разницу работы с указателями и самими объектами( или это копии объектов)...объясните пожалуйста!вообще советовали по мере возможности работать с указателями
Записан
Bepec
Гость
« Ответ #1 : Февраль 28, 2012, 07:04 »

дельфиг прыг акула кусь...

Почитай на досуге о классах С++.

А по теме: указатель на объект - это указатель на кусок памяти, где начинается объект. Чтобы с ним работать как с объектом, нужно его преобразовать к типу твоего класса. И усё получится.

А ещё лучше - приведи код, который у тебя не бачит, мы тебя поправим и, возможно, сумеем тебе пояснить Подмигивающий
Записан
Disa
Гость
« Ответ #2 : Февраль 28, 2012, 08:56 »

Как я понимаю, при передачи объекта на прямую всегда вызывается конструктор копирования и если он не перегружен, то копирование происходит полностью побитовое.

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

Google style guide рекомендует изменяемые значения передавать по указателю, а не изменяемые по константной ссылке(чтобы не занимать память копией объекта), чтобы при вызове функции можно всегда было понять какое значение меняется, а какое нет:

Код
C++ (Qt)
void foo(const myType& i, myType *j) {
 //do something
}
 
// вызов функции
myType i, j;
foo(i, &j);  // видно, что переменная j может быть изменена в ходе работы foo, а i - нет
 

Ну как говорится на вкус и цвет.
PS: Поправьте пж если не прав)
« Последнее редактирование: Февраль 28, 2012, 08:59 от Disa » Записан
Bepec
Гость
« Ответ #3 : Февраль 28, 2012, 09:01 »

В принципе да, ты прав. Это хороший стиль программирования. Я им пока владею плохо Подмигивающий

Маленькое но - если объект содержит ссылки/указатели, то побитовое копирование безвозвратно может их утерять, изменить и будет большой бада-бум  Подмигивающий

PS чуть сумбурно, но именно так я себе всё и представляю. Турум пурум.
Записан
Disa
Гость
« Ответ #4 : Февраль 28, 2012, 10:06 »

Цитировать
Маленькое но - если объект содержит ссылки/указатели, то побитовое копирование безвозвратно может их утерять, изменить и будет большой бада-бум

А спасибо! Не знал, точнее пока на практике сам не реализовывал такие классы и поэтому не задумывался.
Записан
Bepec
Гость
« Ответ #5 : Февраль 28, 2012, 10:25 »

Даже не так.

Конструктор копирования не замечает ссылок, а тупо побитово копирует содержимое указателя/ссылки(адрес, а не содержимое). И будет 2 класса, которые используют один указатель/ссылку, что приведёт к неприятностям. Аля как у меня - БСОД после 30 отправки данных  Строит глазки И фиг найдешь, если кто не поможет.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Февраль 28, 2012, 10:49 »

по ходу я не совсем понимаю разницу работы с указателями и самими объектами( или это копии объектов)...объясните пожалуйста!вообще советовали по мере возможности работать с указателями
Это улавливается интуитивно, по мере накопления опыта. На первых порах отталкивайтесь от простого соображения: в С/С++ переменная - это ячейка памяти. Адрес этой ячейки определяется при объявлении переменной и никогда не меняется. Адрес можно записать а др ячейку - это и будет "указатель".  Неск примеров

Код
C++ (Qt)
int a = 1;        // "а" заняло свою ячейку (4 байта)
int * pa = &a;  // "pa" (сама тоже ячейка) содержит адрес "a" (указывает)
*pa = 2;        // изменили содержимое на что указывает "pa" (теперь a = 2)
pa = &b;       // а теперь "pa" указывает уже на что-то другое
 

 
Записан
Tonal
Гость
« Ответ #7 : Февраль 28, 2012, 10:50 »

Блин, народ, копирование поБАЙТОВОЕ а не поБИТОВОЕ.
В современных машинах нет простой возможности скопировать несколько битов из произвольного места в другое произвольное место, если эти числа не кратны размеру байта.
Все адреса в С/С++ указываются с точностью до БАЙТА. Размеры (sizeof) в С/С++ - в байтах.

По стандарту, дефолтное копирование реализовывает «почленное копирование» - это как будто ты вручную написал присвоение для всех полей.
Но в реале компилятор, когда реализует копирование простых структур, просто копирует байты источника в байты получателя.
Причём, в некоторых случаях между полями структуры могут быть дыры, и дыры могут быть между соседними структурами (в массиве), но компилятору это до фени - он будет копировать весь блок байтов от первого до последнего.

Соответственно, если какие-то поля - указатели, то они так же скопируются как и всё остальное.
Поэтому, если эти указатели в экземпляре источника и получателя указывали на разные объекты, то указатель получателя затрётся.
Это нужно учитывать и освобождать, или уменьшать счётчик использования, или добавлять в список свободных объектов...

П. С. Наследование и возможность переопределения копирования несколько усложняют картину, но не сильно. Улыбающийся
Записан
Bepec
Гость
« Ответ #8 : Февраль 28, 2012, 10:54 »

Побитовое - побайтовое какая разница. Тут до низших уровней не спускаемся Подмигивающий
Записан
IzoLda
Гость
« Ответ #9 : Февраль 28, 2012, 11:37 »

спасибо большое всем за  доступно изложенные  ответы!!!будем наращивать опыт! Улыбающийся
Записан
Tonal
Гость
« Ответ #10 : Февраль 28, 2012, 13:42 »

Побитовое - побайтовое какая разница. Тут до низших уровней не спускаемся Подмигивающий
Разницу я привёл - в С/С++ нельзя простыми спосовами скопирвать произвольную последовательность БИТОВ из произвольного места в другое, если размер последовательности и адреса не кратны 8. Улыбающийся

Всегда лучше употреблять правильные и точные слова - потом меньше будет дыр в абстракциях. Улыбающийся

П. С. Да, я зануда. Улыбающийся
Записан
Disa
Гость
« Ответ #11 : Февраль 29, 2012, 08:53 »

Цитировать
Разницу я привёл - в С/С++ нельзя простыми спосовами скопирвать произвольную последовательность БИТОВ из произвольного места в другое, если размер последовательности и адреса не кратны 8.

Всегда лучше употреблять правильные и точные слова - потом меньше будет дыр в абстракциях.

Написал потому что эта фраза уже заезжана по ушам была))

Как я понимаю, сами биты копировать и не к чему, потому что размер класса всегда будет целое число байт, тк в плюсах всегда происходит выравнивание в памяти по размеру типа (а в случае с классом - кратным наибольшему из них), а методы копировать не требуется. Нет?
Записан
qt_user
Гость
« Ответ #12 : Февраль 29, 2012, 10:07 »

а методы копировать не требуется. Нет?
нет, на сколько я помню, у методов глобальное время жизни они существуют еще до того как
как будет создан любой экземпляр данного класса, каждому методу передается скрытый указатель на
объект this
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #13 : Февраль 29, 2012, 11:23 »

Как я понимаю, сами биты копировать и не к чему, потому что размер класса всегда будет целое число байт, тк в плюсах всегда происходит выравнивание в памяти по размеру типа (а в случае с классом - кратным наибольшему из них),
Нет. Адрес каждого члена выравнивается на min(sizeof(member), align_size) где align_size задается компилятором и/или через #pragma

а методы копировать не требуется. Нет?
Прошу показать каким образом можно скопировать метод (ну хотя бы один)
Записан
Bepec
Гость
« Ответ #14 : Февраль 29, 2012, 12:04 »

Был один человек, он помоему побитовое копирование даже реализовывал Веселый Правда делал он это под linux Подмигивающий

А скопировать метод можно ЧУДЕСНЫМ способом Веселый
Записан
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.224 секунд. Запросов: 23.