LINUX.ORG.RU

[C++] Вопрос начинающего программиста. По поводу хранения объектов классов

 


0

2

Например, у меня есть класс CRectangle (наследуется от CDrawObject). В нём хранятся данные для описания прямоугольника. Объекты этого класса хранятся в поле list<CDrawObject*> m_Objects; класса CCompositePrimitive. Объект CCompositePrimitive объявлен так

CCompositePrimitive m_DrawOjects;

Т.е. чтобы добавить новый объект в DrawOjects, я вызываю соответствующий метод Add(..) и выделяю память в куче для CRectangle

void CCompositePrimitive::Add() {
 Objects.push_back(new Rectangle(параметры конструктора))
}

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

Вопрос вот в чём: где у меня (в какой памяти: в куче или стеке)? хранятся все объект.

Спасибо, извиняюсь, за глупый вопрос


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

sacred ★★
()

CCompositePrimitive

CDrawObjec

CRectangle

C

Венгерская нотация!1111111пыщьпыщьпыщь! Выкинь её пока не поздно, мой тебе совет. Все эти префиксы - сплошные грабли

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

почему выкинуть? почему грабли? можно подробнее?

какие проблемы в перспективе будут из-за этого?

g-71
() автор топика
Ответ на: комментарий от g-71

почему выкинуть? почему грабли? можно подробнее?

как-то так

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

Постфикс в виде одного подчеркивания IMHO удобнее.

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

Ну в конкретном примере я бы сказал что это не венгерка, а соглашение о наименовании классов в конкретной библиотеке. Взять тот же Qt, там все имена классов начинаются с Q.

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

> IDE же показывает.

какая IDE? у меня ничего не показывает, а кто-то вообще простым текстовым редактором пользуется

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

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

g-71
() автор топика

Фу, не используй венгерскую нотацию. Смотрится противно. Прям как в MS. Лучше так.

Class MyClass;
void MyClass::scroll();
void MyClass::doSomething();
bool MyClass::isScrollable();
double MyClass::scrollValue();
bool is_scrollable;
double some_value;
int some_counter;

Ну и поля в виде m_scroll_counter.

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

Использовать CamelCode для всего, кроме имён переменных, удобно потому, что так можно будет часто сразу отличить метод от переменной.

Obey-Kun ★★★★★
()
Ответ на: комментарий от g-71

> почему выкинуть? почему грабли? можно подробнее?

Проблемы простые. Нужно документировать не столько тип объекта (это ты знаешь и так), сколько его значение.

Т.е., на пальцах, M$ со своими LPCSTR и т.д. извратила всю идею - заместо описания объекта, здесь описывает тип.

Примеры удачного использования венгерской нотации можно найти на ссылку на блог joel-on-sw. Краткие примеры - префиксы для строковых переменных в .js с указаением, «безопасная» ли строка (нужно или нет экранировать значение при некоторых операциях) или кодирование типа координат - у нас есть переменный типа int (к примеру), но координаты могут быть абсолютными либо относительными (причем относительно нескольких объектов - фрейма, поля ввода, етц).

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

> с темы в теорию. Чем плох CRectangle?

Тем, что сразу ясно, что это - не int, не float и не char - это класс. Смысла здесь в префиксе «С» нет никакого.

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

Перефразирую:

В дублировании информации смысла нет. Тем более, указывать в названии класса, что это класс - верх маразма.

Это всё равно, что писать вот так:

typedef int iInt;

Смысла в префиксе i здесь нет

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

GTK+ - это Си с классами.

Пакет Microsoft Foundation Classes (MFC) — библиотека на языке C++, разработанная Microsoft и призванная облегчить разработку GUI-приложений для Microsoft Windows путем использования богатого набора библиотечных классов.

Источник: Википедия.

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

А Qt - это «Си с классами» + moc? Настоящий C++ только в boost?

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

>> с темы в теорию. Чем плох CRectangle?

Тем, что сразу ясно, что - это ... класс

Ты так уверен, что не бывает переменных с именем Ractangle?

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

> Ты так уверен, что не бывает переменных с именем Ractangle?

1) Ты путаешь «переменную» и имя типа

2) Да, «Ractangle» - это ад. Не верю, что люди в здравом уме будут так называть что-то.

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

Я не путаю, я как раз знаю, что переменные и типы в си делят общее пространство имён и префикс «C» - по моему приемлемый способ разрешать коллизии наподобие «воробей по имени Воробей, гусеница по имени Гусеница».

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

Посколько С++ - регистрозависимый, то никакой коллизии нет.

Rectange rectange; - все ок

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

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

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

Этот чтоли? Так его тут уже озвучили. Конкретно это правило не лишено разумности, а вообще у гугла какой-то долбанутый кодстандарт, целиком его лучше на вооружение не брать.

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

нп
Плавно съехали с первоначальной темы. Зато всем есть, что сказать.

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

Здесь ваще-то форум про development, а красноглазые идут нах^Wк Столлману.
Мне важна эффективность, а не идеология. Возможно, и другие IDE дают такую информацию, я не в курсе.

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

стерев твой жир с монитора, я обнаружил следующее:

# Development (289433/700/253) - программирование и разработка ПО под Linux/Unix

деточка, сходи к окулисту, он поможет тебе эффективней видеть

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

> Анон, ты со своим (безусловно ненужным) LPCSTR не съезжай с темы в теорию. Чем плох CRectangle?

Тем, что если с большой буквы называть только классы и enum'ы, то всё ок будет.

Rectangle my_rectangle.

Obey-Kun ★★★★★
()
Ответ на: +1 от legolegs

Это не в защиту всякой венгерской нотации, а в защиту m_.

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

Под нормальными правилами именования я подразумеваю что-то типа этого: snake_case для переменных, SnakeCase для классов и enum'ов, snakeCase для методов и функций. А также префикс m_ для полей. И, естественно, такие названия, которые сразу дают нам понять о том, что из себя представляет данная переменная.

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

> И, естественно, такие названия, которые сразу дают нам понять о том, что из себя представляет данная переменная.

Или что возвращает данный метод. И т.д.

Obey-Kun ★★★★★
()
Ответ на: комментарий от JackyTreehorn

> Еще один красноглазый? Некоторые вещи удобнее делать мышкой.

Да: рисовать в гимпе/инскейпе, выделять фрагменты текста, мышевозить в играх. Щито еще?

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