LINUX.ORG.RU

Конструируется ли объект, если вызывается static-метод? При условии что один инстанс объекта уже существует.

 , ,


0

2

Хочу понять вот такую тонкость в языке C++.

Есть у нас класс-хелпер, у которого все методы статические (это обычное дело для хелперов).

Где-то в программе инстанс этого хелпера создан, и он существует все время работы программы (но указатель на него не таскается по всем закоулкам программы).

Вопрос: если вызвать статический метод этого хелпера вот таким синтаксисом:

HelperClass::someMethod();

то для его выполнения будет выполняться конструктор объекта, или он выполнится как кусок вышеописанного инстанса хелпера (того, который который существует все время работы программы)? Зависит ли это от настроек компилятора?

★★★★★

Нет и нет. Статические методы класса не получают указателя this, они вызываются без привязки к какому-либо объекту этого класса.

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от no-such-file

Зачем, если все методы статические?

Это особенность QML-движка в Qt. Чтобы обращаться к чему-либо, это что-либо должно быть зарегистрировано в QML-движке и создано как item, то есть иметь свой id. Классу id назначить невозможно, можно назначить только инстансу.

Может быть и есть какой-то другой механизм, но я о нем не знаю.

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

Заведи отдельный класс с нужным поведением и юзай его инстанс. И вообще ты когда проверишь позиционирование окна? (deep-purple)

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

Можно два вопроса? 1) Как ты написал условно-эпичную софтину на крестах если до сих пор задаешь убого-упоротые вопросы. 2) Почему ты до сих пор (за столько лет не осилел кресты, чтобы не задавать таких вопросов.

ЗЫ: не от природной злобности - мне правда интересно как ты это делаешь. Я в цпп мимокрокодил (просто читаю все подряд, в том числе и книги по цпп и меня твои вопросы часто удивляют - чтобы их не задавать обычно достаточно что-то вроде с++ за 21 день. Но ты похоже даже такой убогой фигни не осилил, но пилишь достаточно большую софтину. Мое не понимать :(

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

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

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

Любой кривой проект в вечной бете в тысячу раз лучше идеального, но нереализованного.

100%, хотя бы тем что тогда для программеров работа никогда не иссякнет, т.к. чем читать кривой код будет проще написать с нуля :)

Это так к флуду, без относительно ОП и его вопроса.

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

потому что у туториалов по C++ очень много внимания (ненужного и вредного) уделяется переливанию из пустого в порожнее, т.е. терминологическому жонглированию.

Возьми любой учебник и там половина воды (т.е. половина текста) посвящена бреду про полиморфизм. На самом деле у ООП не полиморфизм, а мономорфизм, т.е. форма одна, разное содержание, но кого это волнует, когда маркетинговая машина запущена на полиморфизм.

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

Т.е. с C всё однозначно: вот аллоцирована память, вот есть пойнтер на неё, вот код в памяти, вот ещё что-то. А в учебниках по C++ вместо этого какая-то инфернальная бредятина.

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

шта?

Чувак, в учебнике написано: у объектов разных классов полиморфизм.

Это бред, потому что вся фишка в том, что ты в одну дырку подставляешь разные имплементации, выглядящие одинаково, т.е. у них одна форма.

Одна форма — это не полиморфизм, а моноформизм.

И это мы пока не перешли к следующему обману века — неработающему наследованию, которым пользуются только в паттерне ActiveRecord

max_lapshin ★★★★★
()

Нет, не будет. От настроек компилятора не зависит. Скажу тебе больше - в других языках (например, Java, Python), где есть статические методы у классов - точно также не прозойдёт конструирования объекта и конструктор вызван не будет.

Статические методы и переменные фактически ничем на низком уровне не отличаются от обычных функий и глобальных переменных. Просто у них ограниченная область видимости.

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

На самом деле у ООП не полиморфизм, а мономорфизм, т.е. форма одна, разное содержание, но кого это волнует, когда маркетинговая машина запущена на полиморфизм.

О, анонiмус вкатился в тред.

Ждём царя.

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

О, анонiмус вкатился в тред.

Это не анонимус. Это человек, больно ударенный в детстве C++ом, так и не оправившийся от этой травмы и нашедший для себя спасение в Erlang-е. Ну а с недавних пор еще и в Rust-е.

C++ом он владеет настолько, что даже родил следующий перл: «Писать серверного демона на С++ — это означает выгребать корки по утрам.»

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

Почему ты так уверен?

Потому, что человек, который развивает собственный софтварный бизнес вряд ли будет иметь время и желание упарываться Io/JavaScript-ом и нести слабосвязный бред на LOR-е.

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

Время и желание воевать против заговора маркетологов находится же.

Он не воюет. Он занимается собственным маркетингом. Мол, ничего, кроме говна на этом вашем C++ сделать нельзя. В отличии он выбранных правильными пацанами из erlyvidio Erlang-е и Rust-е.

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

max_lapshin, eao197
Он занимается собственным маркетингом.

А тут весело. Даешь батл мерчендайзеров.

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

в руби кстати будет создан, но будет создан объект класса Class, экземпляр которого будет как раз классом для своих экземпляров.

Это связано с тем, что в руби принципиально нет функций, а есть лишь методы классов, которые обязательно вызываются на экземплярах этих классов.

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

в руби кстати будет создан

Докажите, плиз, что метаобъект для Class-а будет создан в момент вызова class method-а. А не раньше, когда Ruby встретит объявление этого класса.

Ведь после class SomeName этот самый метаобъект уже существует, что и позволяет в определении класса использовать Ruby-овые трюки по метапрограммированию, использующие и class method-ы.

Так что в Ruby сперва будет создан class instance, лишь затем вы сможете вызывать class methods. Что означает, что вызов class method-а не будет приводить к созданию class instance, т.к. class instance уже есть.

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

Можно два вопроса? 1) Как ты написал условно-эпичную софтину на крестах если до сих пор задаешь убого-упоротые вопросы. 2) Почему ты до сих пор (за столько лет не осилел кресты, чтобы не задавать таких вопросов.

Не от природной злобности - мне правда интересно как ты это делаешь. Я в цпп мимокрокодил (просто читаю все подряд, в том числе и книги по цпп и меня твои вопросы часто удивляют - чтобы их не задавать обычно достаточно что-то вроде с++ за 21 день. Но ты похоже даже такой убогой фигни не осилил, но пилишь достаточно большую софтину. Мое не понимать :(

Потому что современное программирование - это не знания о том, как жонглировать байтами в памяти. Не вижу никакого достоинства в том, чтобы программируя на языке высокого уровня (у нас же C++ таки не макроассемблер), все время съезжать в низкий уровень и заниматься байтодрочеством. Все это отдано на откуп компиляторам, и это есть хорошо. Те вопросы, которые я задаю, возникают редко, когда дело касается оптимизации, узких мест или «всеобемлещего непонятного устройства языка». Тогда хочешь-не хочешь, приходится учитывать, как оно там в памяти размещается и какими инструкции будет пережевывать процессор.

Например, если бы вовремя не подоспел Qt с человеческой реализацией строк QString, я бы наверно никогда плюсами и не занялся. Плевать как оно там в памяти размещается и копируется, лишь бы работать было удобно. Вертел я болту эти уродские сишные строки и std::string, от которых язык оказывается абсолютно непригодным для хоть какого-то вменяемого использования, и софт на GTK/+ это наглядно демонстрирует. И вообще я жду, когда наконец завезут в плюсы нормальные многомерные массивы, чтобы с ними может было управляться так же просто как в фортране.

Не от природной злобности - мне правда интересно как ты такой умный и продвинутый, разбирающийся в маргинальщине типа эрланга или раша, до сих пор не понял простой истины: дело не в технологиях, а в системном подходе. Если ты пишешь на языке, которого до конца не знает сам автор языка, то главное для тебя должен быть не язык со всеми его тонкостями и причудами, а его уровень. Если ты пишешь на высоком уровне, то твоя главная задача - делать правильную декомпозицию задачи и использовать те инструменты которые под нее подходят. Плюс, твоя задача - писать простой и понятный код, который можно будет сопровождать тебе или другому человеку. Именно поэтому мой проект MyTetra молча форкнул китаец, и стал плить свою софтину Tute. И его не покоробило, что я не умею в умные указатели, не пишу auto, путаюсь с апкастом и даункастом, не использую побочные эффекты, не умею писать const и не знаю, конструируется ли объект, если вызывается static-метод. Его устроило то, что глядя на мой код он без проблем понял структуру проекта, и сразу увидел что за что отвечает. Это главное.

Осилить плюсы я не могу в связи с их фантастической сложностью. Для одних достаточно сказать, что в операции n++ «происходит изменение значения после использования». А меня эта фраза только еще больше запутывает. Поэтому я годы трачу на то, чтобы понять, что имел в виду автор: Понимание преинкремента и постинкремента в языке C++. С такими темпами далеко не уедешь, поэтому разумный выход - пользоваться тем подмножеством языка, с которым ты криво-косо умеешь управляться. Так хотя бы будут проекты, которые тебе нужны, а не только пустое «начну писать, когда полностью выучу язык, чтобы анонимусы не батхертели».

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

Плевать как оно там в памяти размещается и копируется, лишь бы работать было удобно.

Э, уважаемый, вам с таким подходом не в C++, вам нужно в Java, C# и иже с ними.

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

Разумный выход — это пользоваться другим языком.

Нет, серьезно. И дело здесь вовсе не в том, что кто-то освоил C++, а кто-то нет. А в том, что C++ — это язык для сложных задач, в которых понимание происходящего «под кaпотом» просто-напросто must have.

Для прикладухи, в которой не нужно понимать, что из себя представляет std::string, давным-давно сделали более удобные для прикладной разработки инструменты.

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

так и в питоне объект типа класс будет создан сразу после подсасывания определения класса

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

программируя на языке высокого уровня (у нас же C++ таки не макроассемблер)

C++ — это язык низкого уровня, в непонимании этого главная твоя ошибка

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

Да ладно, что такое static чуть ли не в первой главе в каждой книжке по цпп было

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

Если знаешь Цэ, много лет назад мне помогла книга «От С к С++» - отличный справочник старых Wtf? по плюсам.

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

Постинкремент, который вызывает ступор у ТС-а — это наследие C. Раз ТС не понимает как работает постинкремент, у него с C не меньшие проблемы, чем с C++. А может и большие.

Цэ - практически паскаль

С учетом того, насколько сильнее у Паскаля типобезопасность, это мощное утверждение, внушаить. Согласиться можно разве что в том смысле, что и C, и Паскаль в настоящее время — это древнее говно.

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

Просто ты перфекционист-теоретик, а ОП методом проб и ошибок решает интересующую его прикладную задачу.

+1.

Тут пол-ЛОРа такие перфекционисты-теоретики. Причём знание ЯП — это куда ни шло, это в целом разумное требование, а некоторые ещё требуют закапывать проекты, у которых исходники не на гитхабе или комментарии на «неправильном» языке, при том, что сам закапыватель в проект не коммитил и не собирается...

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

C++ — это язык низкого уровня, в непонимании этого главная твоя ошибка

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

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

и продолжай копошиться в своем ассемблере. Я в свое время покопошился, и мне достаточно

тогда зачем ты продолжаешь есть кактус? есть другие ЯП действительно высокого уровня, пиши на них

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