LINUX.ORG.RU

Проясните отличие


0

1

Каюсь, ООП моё было Delphi, а ученичество было Borland Pascal. Вроде и разобрался в Qt4, даже написал собственноручно прогу, но так и не понял, в чем отличие object.func() и object->func(). Может, кто обьяснит популярно? Желательно без стёба: что такое ООП я хорошо понимаю и умею. На дельфи, да, но это ничуть не хуже чем на си. И да, Lasarus = говно.

★★

object.func()
objectPtr->func()

вот и отличие. во втором случае - указатель на объект

что такое ООП я хорошо понимаю

кстати, сомнительное утверждение после таких вопросов..

aol ★★★★★
()
Последнее исправление: aol (всего исправлений: 1)

Второе разыменовывает указатель. Если указатель на объект, писать ->, если просто объект, писать точку.

PolarFox ★★★★★
()
Object obj;
obj.func(); // правильно
obj->func(); // неправильно

Object *obj2 = new Object;
obj2.func(); // неправильно
obj2->func(); // правильно
devpony
()

второе — это (*object).func()

quowah
()

Еще один пример, подтверждающий, что прежде чем браться за это поделие(Qt) стоит изучить С++.

anonymous
()
Ответ на: комментарий от devpony

Вот!

devpony (22.03.2013 17:32:40)

Спасибо тебе, добрый человек, что так просто разрешил проблему! То есть, "->" надо использовать в случае указателя на обьект, а точку на сам обьект. Я так понял. Правильно?

cadaber ★★
() автор топика
Последнее исправление: cadaber (всего исправлений: 3)

Каюсь,ООП моё было Delphi, а ученичество было Borland Pascal

Наоборот, гордись :) Делай из «недостатков» знамя - это бесит илитистов.

slackwarrior ★★★★★
()
Последнее исправление: slackwarrior (всего исправлений: 1)

в чем отличие object.func() и object->func(). Может, кто обьяснит популярно?

Если ты пользовался под Delphi указателями, то сразу поймешь в чем разница между

object.func;
и
object^.func;

object->func(); это шоткат аналогичный вот такой записи (*object).func();

slackwarrior ★★★★★
()
Ответ на: комментарий от cadaber

То есть, "->" надо использовать в случае указателя на обьект, а точку на сам обьект. Я так понял. Правильно?

Да, как уже и объяснили выше.

devpony
()
Ответ на: комментарий от slackwarrior

Если ты пользовался под Delphi указателями

Видишь ли какая штука, что Паскаль, что Дельфи - почему-то усиленно прячут от программиста даже всякое упоминание об указателях. Меня спасло то, что в последнее время (активной жизни в винде) я почти не использовал стандартных библиотек, а пользовался исключительно winAPI, где указатели на структуры в порядке вещей. И тем не менее, даже если указать в обьекте структуру, Дельфи все равно позволяет использовать ее явно, без префиксов-постфиксов, как в С. Не знаю, как выразить точнее, но суть такая, что обьявленная переменная сама по себе является указателем и компилятор это хавает.
Не могу сказать, что Дельфи - плохой язык. Библиотеки многие написаны криво, в частности BDE, - это да.

cadaber ★★
() автор топика
Ответ на: комментарий от cadaber

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

anonymous
()
Ответ на: комментарий от anonymous

Как можно писать код, не зная языка

Оказывается, можно. Я хотел себе такую поделку - я ее написал. Может, позже в плазмоид трансформирую...

cadaber ★★
() автор топика
Ответ на: комментарий от aol

что такое ООП я хорошо понимаю

кстати, сомнительное утверждение после таких вопросов..

Да ни разу. ООП и работа с указателями в общем случае ортогональны.

KRoN73 ★★★★★
()
Ответ на: комментарий от cadaber

Лучше бы ты сразу в плазмоидах посмотрел, у кед же есть такой виджет. От просмотра гарантировано скорое возвращение в делфи.

http://websvn.kde.org/*checkout*/branches/KDE/4.3/kdebase/workspace/plasma/applets/battery/battery.cpp

cdshines ★★★★★
()
Последнее исправление: cdshines (всего исправлений: 1)
Ответ на: комментарий от cdshines

у кед же есть такой виджет

Есть, но он не настолько информативный. Мне интересны числовые значения, а не проценты. Хотя, при желании, можно распарсить строки и вывести проценты. И да, в слаке 14 этот виджет бывает глючит. Вместо реального показывает хрензначто, например недавно при полном заряде показал 40%. Я щелкнул на своей проге - нормально.

cadaber ★★
() автор топика
Последнее исправление: cadaber (всего исправлений: 1)

object.func() — object это адрес первого байта в блоке памяти, с которого начинается объект.

object->func() — object это адрес переменной-указателя (пойнтера), в котором хранится тот самый адрес из первого примера. то же самое, что и (*object).func()

chg ★★★★★
()
Ответ на: комментарий от chg

Козленочком я уже никогда не стану (седые волосы уже лезут), а вот козлом я уже стал. И не один раз. =)

cadaber ★★
() автор топика
Последнее исправление: cadaber (всего исправлений: 1)
Ответ на: комментарий от cadaber

Я, кстати, сполз со слаки после пары лет именно из-за того, что надоело собирать свежее ПО самому, а ждать, пока баги в старом пофиксятся, надоело.

cdshines ★★★★★
()
Ответ на: комментарий от cdshines

Я, кстати, сполз со слаки после пары лет именно из-за того, что надоело собирать свежее ПО самому

Ну не скажи, 13.37 вполне себе неплохая получилась. 14.0 понятно еще сыровата, но у меня стоит, сверхглюков пока не наблюдается. А насчет собирания софта - так это на любителя. Я вот недавно скачал qtgzmanager, так красота, обновлять пакеты можно не шарясь по репозитариям.

cadaber ★★
() автор топика
Ответ на: комментарий от cdshines

ну старость - это не всегда возраст, это скорее самочувствие.

rikardoac
()
Ответ на: комментарий от cadaber

Ну на то они и ссылочные типы :) Но книжку по собственно языку никто не отменял (хоть бы и Фаронова :)), а в классическом паскале (с Виртом и списками)... Или в аццко-неклассической «турбе» (с директивой absolute и move()) никакими ссылочными типами, которые «прячут» и не пахнет - хочешь ссылаться, юзай указатели. Операции взятия адреса и разыменования - и вперед стрелять по ногам :) А с ссылочными это могло получаться у талантливой студентоты еще лучше и трагичнее - например, мистический «аксец вайолейшон» при какбэ «не юзании указателей», раз уж «дельфи хавает» и делает какую-то преобразовательную работу за программиста.

slackwarrior ★★★★★
()
Последнее исправление: slackwarrior (всего исправлений: 1)
Ответ на: комментарий от cdshines

Я, кстати, сполз со слаки после пары лет именно из-за того, что надоело собирать свежее ПО самому, а ждать, пока баги в старом пофиксятся, надоело.

Аналогично. Только гента, только автомат.

PaxtonFettel
()
Ответ на: комментарий от slackwarrior

Ну, у меня учебником была бумажная книжка Рэй Конопка, «Создание оригинальных компонент в среде Delphi». К тому же я хорошо к тому времени знал Borland Pascal. Не Turbo, а именно BP, который с нехилой поддержкой ооп.

cadaber ★★
() автор топика
Ответ на: комментарий от cadaber

в дельфях же две модели обьектов.

ну и затруднение как наверно уже сказали что в дельфях другой по сравнению с C++ переменных у которых делается разыменование

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

qulinxao ★★☆
()
Ответ на: комментарий от cadaber

с чего бы

просто эти редиски ( подчинёные Филипа Кана) посчитали ( и не ошиблись) что обьекты в дельфях должны быть по умолчанию ссылочным ( т.е держать адрес структуры) в отличии от того же BP в котором обьект был буквально value.

что приводило к забавностям различным

а дак Дельфи - нормальный язык.

qulinxao ★★☆
()
Ответ на: комментарий от qulinxao

усугубление чехарды со строками начиная с Delphi2

Не видел. Прыгнул с Паскаля прямо в Дельфи 3. И могу сказать, что строки там просто обозвались типом String, добавили в конец нулевой байт, и ничего по сути не изменилось.

cadaber ★★
() автор топика
Ответ на: комментарий от cadaber

Дельфи вообще последствие переключение бизнеса с универсального для любителей персоналок ТР на рад морду для эньтерпрайза.

в том и прикол что если внутрь не лезть там всё удобно для пользователя-программиста , если же внутрь тех же строк лезть то кошмар почище w_char c++ у дельфи были /есть shortstring ansistring pcharz

затем они как обьекты сделали строки сылочным типом , что привело к изменению(точнее обновременно старые строки по прежнему копируются/ новые становятся псевданимами) семантики s2:=s1

т.е в резултате PowerBuilder для ЭксСССР - не даром ща разрабы дельфей в Питербурге.

qulinxao ★★☆
()
Ответ на: комментарий от qulinxao

Нормального парсинга строк там нет, ие, регулярные выражения есть, но куцие, обрезанные.

cadaber ★★
() автор топика
Ответ на: комментарий от cadaber

В борланд-паскальных строках String с турбы начиная длина вначале и никаких нулевых байтов (см. описание языка, в Object Pascal как он назывался в Delphi 3 изменился только объем хранения - в Delphi 3 появились длинные строки, а в BP и Delphi 1, например, String был 255 символов, но представление в памяти не менялось - вначале идет длина строки). Нулевой байт в конце - в PChar (они Null-terminated).

slackwarrior ★★★★★
()
Последнее исправление: slackwarrior (всего исправлений: 1)

Я просто оставлю это здесь

#include <iostream>

class Foo {
public:
	void func() { std::cout << "Foo::func()" << std::endl; }
};

class Object {
	Foo foo;
public:
	void func() { std::cout << "Object::func()" << std::endl; }
	Foo* operator->() { return &foo; }
};

int main()
{
	Object object;

	object.func();
	object->func();
}
ratvier ★★
()
Ответ на: комментарий от slackwarrior

Да глупости. Ну появилось новый класс TString но строки от этого не пострадали. Гораздо больше они пострадали от тупых юзеров, уж начто Дельфи терпим к дебилам. Насчет видестринг, это для самых упоротых товарищей же. Обычно использовался класс TStrings для работы со строками. С не одной - ТStringList.

cadaber ★★
() автор топика

И да, Lasarus = говно

Ниасиляторы такие ниасиляторы.

necroposter
()
Ответ на: комментарий от cadaber

ну смотри у тебя по мере юзанья . и -> в голове перемкнёт в С++ можно сам обьект завести на стеке(как обычную value примитивного типа в дельфи или как обьекты из bp|tp)

у тя бы и вопрос ОП даже не возник работай дельфи как старый паскаль турбо переода.

qulinxao ★★☆
()
Ответ на: комментарий от cadaber

Да глупости. Ну появилось новый класс TString

О'кай, спишем на то, что ты ж не читал Language Guide :) Какой еще TString? Не было такого. И не вайд, а лонг :) Она же AnsiString - для большинства дельфистов, кто не читал описание языка, просто String (это ее алиас). Отличается от ShortString (в курсе про такую? Синоним 255 паскале-строки, которую еще и можно специально ограничить в объявлении переменной нужным количеством символов) тем, что имеет гораздо меньше ограничений по размеру (2^31 символов - до 2Гб). WideString - это уже юникодные заморочки, нормальной поддержки которых в дельфях до 7 не было. TStrings - это как раз коллекция AnsiString. Разница в представлении в памяти между String и PChar (они тупо разные) кажется глупостями до первого выстрела в ногу и записи мусора в произвольную память дельфистами, которым было лень вдаваться в подробности, когда они начаинали работать с WinAPI, который никак не защищен от ковбой-стайл программирования.

slackwarrior ★★★★★
()
Ответ на: комментарий от slackwarrior

Чё орать-то? Делфы - дела давно минувших дней, неактуально. Давай лучше про что более свежее, qt5 например.

cadaber ★★
() автор топика
Ответ на: комментарий от cadaber

Кто орет-то? Ты как-то буковки воспринимаешь превратно :)

slackwarrior ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.