powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / А где создание объекта
25 сообщений из 96, страница 1 из 4
А где создание объекта
    #38759686
Фотография Judo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Делаю первые шаги в Куте. Нашел пример как показать messagebox
Код: plaintext
1.
2.
3.
  QMessageBox msgBox;
  msgBox.setText("Hello Here");
  msgBox.exec();



Я ожидал увидеть что то типа:
Код: plaintext
1.
  QMessageBox mb = new QMessageBox();



Возник вопрос как это тогда работает без создания объекта, т.е. мы имеем просто ссылку msgBox а объекта нет ?
...
Рейтинг: 0 / 0
А где создание объекта
    #38759689
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут тебе не паскаль. msgBox - в натуре объект, а не какая-то там ссылка.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
А где создание объекта
    #38759692
Фотография Judo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovТут тебе не паскаль. msgBox - в натуре объект, а не какая-то там ссылка.

Дима - запарил ))) Вопрос адресован был к кутешникам
...
Рейтинг: 0 / 0
А где создание объекта
    #38759701
Фотография Judo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почитал в доке куте, что QMessageBox msgBox; фактически создает статический объект в стеке.
кутеAs you have recognized already there are different ways to use QMessageBox. The static method is for displaying a message box quickly. IMHO it is more a matter of taste and preference which you are using.
However, the non-static methods you are referring are different from the location where you are placing the instance. The first method uses the stack for the complete object. The second method is using the heap
Так в принципе понятно, идем дальше, самое интересное в словах
кутеThe first method uses the stack for the complete object.
Открываю исходники QMessageBox.h и ищу слово static. В итоге ничего напоминающего на создание статического объекта в стеке - нет. Т.е. я ожидал что статический стековый объект - будет глобальным
stackoverflowA static variable is basically a global variable, even if you cannot access it globally. Usually there is an address for it that is in the executable itself. There is only one copy for the entire program. No matter how many times you go into a function call (or class) (and in how many threads!) the variable is referring to the same memory location.
И поэтому использование
Код: plaintext
1.
QMessageBox msgBox;


плохой тон ввиду потоков и проч, ввиду того что объект один глобально.
Поправьте меня если я не прав. После этого не охота практиковать использование QMessageBox без new.

Также получается что фраза из приведенного выше текста
автор..
uses the stack for the complete object
..
не верна. Потому что объект static variable is basically a global variable - т.е. объект все таки в хипе, а ссылка на него в стеке - так ?
...
Рейтинг: 0 / 0
А где создание объекта
    #38759716
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Judo,

Слово "статический" в тех цитатах, что вы привели, относится к методам, а не объекту.
А чтобы создать статический объект нужно явно указать static при его объявлении.
Более того, нельзя вообще создать "статический объект в стеке". Можно либо в стеке либо статический.
Таким образом ваши выводы про глобальность объекта, проблемы с потоками и пр. не соответствуют действительности.
...
Рейтинг: 0 / 0
А где создание объекта
    #38759845
Sheraton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Объекты создаются либо статически (при компиляции вы заранее знаете, что этот объект точно будет нужен) либо динамически (в процессе работы программы, но может и не понадобиться), статические объекты размещаются в стеке, динамические в куче.

QMessageBox msgBox; - это статическое создание объекта в стеке.

QMessageBox mb = new QMessageBox(); - это динамическое создание объекта в куче.
...
Рейтинг: 0 / 0
А где создание объекта
    #38759856
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sheraton,

Откуда вы эту терминологию берете :)

По месту выделения памяти для данных объекты делятся на
- автоматические (в стеке)
- статические (в глобальном сегменте данных)
- динамические (в куче)

Ни в каком другом смысле слово "статический" по отношению к объектам в С/С++ не применяется.
И поэтому ни при каких обстоятельствах статические объекты не могут размещаться в стеке.
...
Рейтинг: 0 / 0
А где создание объекта
    #38759864
Sheraton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskySheraton,

Откуда вы эту терминологию берете :)

По месту выделения памяти для данных объекты делятся на
- автоматические (в стеке)
- статические (в глобальном сегменте данных)
- динамические (в куче)

Ни в каком другом смысле слово "статический" по отношению к объектам в С/С++ не применяется.
И поэтому ни при каких обстоятельствах статические объекты не могут размещаться в стеке.

Это уже детали. Для новичка изучающего С++ лучше простое объяснение.
...
Рейтинг: 0 / 0
А где создание объекта
    #38759868
Sheraton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И кстати это не моя терминология. Это из книги Липпмана "Язык программирования С++. Вводный курс" Издательство "Невский Диалект", 2003 год. стр.50.

"В С++ объекты могут быть размещены либо статически - во время компиляции, либо динамически - во время выполнения программы, путем вызова функций из стандартной библиотеки. Основная разница в использовании этих методов - в их эффективности. Статическое размещение более эффективно, так как выделение памяти происходит до выполнения программы, однако оно гораздо менее гибко, потому что мы должны заранее знать тип и размер размещаемого объекта."
...
Рейтинг: 0 / 0
А где создание объекта
    #38759869
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SheratonЭто уже детали. Для новичка изучающего С++ лучше простое объяснение.
Это не детали.
Там выше чел уже запутался и искал глобальные объекты там, где их нет, именно из-за неуместного употребления термина "статический" по отношению к методу создания объектов.
...
Рейтинг: 0 / 0
А где создание объекта
    #38759870
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SheratonИ кстати это не моя терминология. Это из книги Липпмана "Язык программирования С++. Вводный курс" Издательство "Невский Диалект", 2003 год. стр.50.

"В С++ объекты могут быть размещены либо статически - во время компиляции, либо динамически - во время выполнения программы, путем вызова функций из стандартной библиотеки. Основная разница в использовании этих методов - в их эффективности. Статическое размещение более эффективно, так как выделение памяти происходит до выполнения программы , однако оно гораздо менее гибко, потому что мы должны заранее знать тип и размер размещаемого объекта."

Так тут как раз не про стековые, а про настоящие статические объекты написано :)
...
Рейтинг: 0 / 0
А где создание объекта
    #38759876
Sheraton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы все усложняете, нужно объяснить более просто, память выделяется либо ДО выполнения программы либо ВО время выполнения программы. Все что ДО это НЕ ДИНАМИЧЕСКОЕ а все что ВО время выполнения это ДИНАМИЧЕСКОЕ выделение. А все эти ваши разделения на статическую- автоматическую и динамическую память, только усложняют простые вещи.
...
Рейтинг: 0 / 0
А где создание объекта
    #38759903
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SheratonА все эти ваши разделения на статическую- автоматическую и динамическую память, только усложняют простые вещи.ага, а потом эти новички берут и задают вот такой вопрос 16630227
Потому что не понимают, что такое "статический", а что такое "на стеке".
...
Рейтинг: 0 / 0
А где создание объекта
    #38759929
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SheratonВы все усложняете, нужно объяснить более просто, память выделяется либо ДО выполнения программы либо ВО время выполнения программы. Все что ДО это НЕ ДИНАМИЧЕСКОЕ а все что ВО время выполнения это ДИНАМИЧЕСКОЕ выделение. А все эти ваши разделения на статическую- автоматическую и динамическую память, только усложняют простые вещи.

Код: plaintext
1.
2.
3.
4.
int main()
{
   int a = 2;
}


Вот в этом коде память переменной a, которую вы выше назвали созданной статически, выделяется ДО или ВО время исполнения?
...
Рейтинг: 0 / 0
А где создание объекта
    #38759951
Sheraton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky..........

Код: plaintext
1.
2.
3.
4.
int main()
{
   int a = 2;
}


Вот в этом коде память переменной a, которую вы выше назвали созданной статически, выделяется ДО или ВО время исполнения?

Память выделяется ДО времени исполнения (даже не смотря на то, что находится внутри функции) и не важно в статическом разделе памяти или автоматическом, важно ДО.
А если бы было:

Код: plaintext
1.
int *a = new a(2); 



то это было бы выделение ВО время исполнения и выделялась бы в куче.
...
Рейтинг: 0 / 0
А где создание объекта
    #38759952
Sheraton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
забыл int после new
...
Рейтинг: 0 / 0
А где создание объекта
    #38759953
Sheraton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну и без а после int new
...
Рейтинг: 0 / 0
А где создание объекта
    #38759955
Sheraton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
:)) в смысле int* a = new int(2);
...
Рейтинг: 0 / 0
А где создание объекта
    #38759970
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SheratonAnatoly Moskovsky
Код: plaintext
1.
2.
3.
4.
int main()
{
   int a = 2;
}



Вот в этом коде память переменной a, которую вы выше назвали созданной статически, выделяется ДО или ВО время исполнения?

Память выделяется ДО времени исполнения (даже не смотря на то, что находится внутри функции) и не важно в статическом разделе памяти или автоматическом, важно ДО.
Извините, но это вообще не так.
Память для автоматических переменных не выделяется ДО исполнения программы.
Она выделяется в момент каждого вызова функции (т.е. во время исполнения), причем сколько раз вызывают функцию, столько раз и выделяется память.
А то что компилятор размер этой памяти заранее рассчитывает, так он при "new a" тоже заранее размер рассчитывает (при компиляции).
...
Рейтинг: 0 / 0
А где создание объекта
    #38759976
Sheraton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyИзвините, но это вообще не так.
Память для автоматических переменных не выделяется ДО исполнения программы.
Она выделяется в момент каждого вызова функции (т.е. во время исполнения), причем сколько раз вызывают функцию, столько раз и выделяется память.
А то что компилятор размер этой памяти заранее рассчитывает, так он при "new a" тоже заранее размер рассчитывает (при компиляции).

Не надо извиняться. Мы живем в свободном обществе, поэтому каждый человек может думать, так как считает правильным. Я буду придерживаться, мнения указанного в книге, выдержки из которой я привел выше. Она у меня сейчас по правую руку, рядом с мышкой лежит.
...
Рейтинг: 0 / 0
А где создание объекта
    #38760018
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SheratonМы живем в свободном обществе, поэтому каждый человек может думать, так как считает правильным
Это не вопрос мнения.
Память либо выделяется либо нет.
Если функция не вызвана, то никакого выделения памяти для автоматической переменной не происходит, независимо от вашего мнения.

И кстати цитата из этой книги, которую вы привели выше, никак не подтвержает ваше мнение.
...
Рейтинг: 0 / 0
А где создание объекта
    #38760043
Фотография Judo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А капец нафлудили ))) Шучу.
Начнем с того что я не новичок ..
Давайте не будем обсуждать простые вещи типа, локальных, глобавльных, регстровых переменных.

Anatoly MoskovskyСлово "статический" в тех цитатах, что вы привели, относится к методам, а не объекту.
А чтобы создать статический объект нужно явно указать static при его объявлении.
Меня интересует статический объект, на методы мне фиолетово (не о них речь сейчас).
Именно его я и искал в модуле QMessageBox и не нашел, там есть только статические методы.
Если он там есть то приведите строку кода из этого модуля - собственно в чем и суть вопроса.

Второй вопрос насчет трактования что статические объекты размещаются в стеке,
Для меня это звучит странно, но так было сказано, боооольшим специлистом на QT
Привожу его слова:
Understanding the different ways to instantiate the QMessageBox class

Andre Andre 6399 posts Certified Specialist Qt DevNet ModeratorAs you have recognized already there are different ways to use QMessageBox. The static method is for displaying a message box quickly. IMHO it is more a matter of taste and preference which you are using.
However, the non-static methods you are referring are different from the location where you are placing the instance.
The first method uses the stack for the complete object. The second method is using the heap.
See this for a short information on heap and stack. [quora.com]
Такой вот крутой из себя модератор заявляет вот такие вот вещи.
Звучит бредово - потому что если есть боольшой статический объект, то на камнях с 32 битной адресацией, он может переполнить сегмент стека. Поэтому второй мой вопрос и был насчет - The first method uses the stack for the complete object.
Здесь акцентируем внимание на слово complete .
Так вот либо у них модераторы глупые либо он реально весь целиком в стеке сидит
...
Рейтинг: 0 / 0
А где создание объекта
    #38760067
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JudoМеня интересует статический объект, на методы мне фиолетово (не о них речь сейчас).
Именно его я и искал в модуле QMessageBox и не нашел, там есть только статические методы.
Если он там есть то приведите строку кода из этого модуля - собственно в чем и суть вопроса.
Да нет там в исходниках класса никакого статического объекта.
Статический или нет - определяете вы, как пользователь класса.
Я вам уже написал, что в той цитате не про объект говорили, а про методы создания - статический (через объявление переменной) и динамический (через new). Но такая терминология вводит в заблуждение, поскольку не делает разницы между данными способами создания объектов:
Код: plaintext
1.
2.
3.
4.
5.
QMessageBox m1;
int main()
{
  QMessageBox m2;
}


m1 - действительно статический объект (как это описано в стандарте), а m2 - автоматический(стековый) - у них совершенно разное время жизни.

JudoПоэтому второй мой вопрос и был насчет - The first method uses the stack for the complete object.
Здесь акцентируем внимание на слово complete .
Врядли полностью на стеке объект создается.
Там наверняка есть вложенные объекты которые размещаются в куче.
Иначе для следующей команды надо было бы заранее резервировать фиксированный массив в объекте для хранения строки, а никакого фиксированного лимита там нет, уверен.
Код: plaintext
1.
msgBox.setText("Hello Here");



JudoТак вот либо у них модераторы глупые либо он реально весь целиком в стеке сидит
Не стоит путать глупость с невежеством :)
...
Рейтинг: 0 / 0
А где создание объекта
    #38760094
Фотография Judo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky
+1
Спасибо за разьяснения.
Проблема была в том что если бы в Java написать
Код: java
1.
  Thread th;


Или в Дельфи
Код: pascal
1.
var th: TThread;


То это не создаст объект. А просто у нас будет ссылка-имя которой потом надо присвоить объект с помощью new или (:=TThread.Create)
В С++ тоже есть new. И я думал что для не элементарных типов его надо всегда использовать.
Поэтому QMessageBox msgBox; выглядит странно - т.е. ссылка есть а объект не выделен.
Может быть это какой то хитрый статический конструктор или фича С++ - видать надо читать ману..
...
Рейтинг: 0 / 0
А где создание объекта
    #38760103
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JudoВ С++ тоже есть new. И я думал что для не элементарных типов его надо всегда использовать.

Нет. В С++ эти два способа абсолютно равноправны с точки зрения функциональности (если не рассматривать размещение и время жизни объекта). И никак специально не надо объявлять класс чтобы обоими способами можно было пользоваться.
Иногда создатели класса запрещают (в документации либо средствами языка) создание объекта иначе чем через new (например при необходимости использовании смартуказателей). Но если явно не запретили - значит вы можете применять оба способа.
Никакой особой разницы не будет. Особенно для классов реализующих GUI, поскольку все они - суть обертки над нижележащими примитивами ОС.
Да и в Qt насколько я помню, все GUI классы реализованы через PImpl, т.е. содержат лишь указатель на фактическую реализацию, так что все равно все в куче выделяется :)
...
Рейтинг: 0 / 0
25 сообщений из 96, страница 1 из 4
Форумы / C++ [игнор отключен] [закрыт для гостей] / А где создание объекта
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]