Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.223.32.230] |
|
Сообщ.
#1
,
|
|||
|
Недавно столкнулся с такой проблемой: Есть базовый класс, который наследуется другим, в базовом классе есть массив вещественных чисел Coord[3]. Я бы хотел получить доступ к этим числам из дочернего класса, но не как к массиву, а как к полям структуры. Например, если бы Coord находился в дочернем классе, то все было бы просто:
Но косяк то в том, что Coord живет в базовом классе, и если такую хрень в него воткнуть, то он будет содержать 2 массива Coord и Parent::Coord, в следствие чего размер увеличится на 12 байт (в 2 раза). Ктонибудь знает как решить эту проблему? Поделитесь идеями... |
Сообщ.
#2
,
|
|||||
|
Второй вариант не использует дополнительной памяти, но придется писать скобки, первый использует 3 указателя... еще можно
но ето уже наглость, и она будет наказана... |
Сообщ.
#3
,
|
|
|
чтото я не понял, ты что хочешь полчить доступ к этементам массива как к полям структуры ? бред какой то, без обид
|
Сообщ.
#4
,
|
|||
|
2 XilinX какой компилятор? (не увидел у тебя в примере имени объединения) У меня все получилось на VC6
sizeof(m_Union); показывает 12, так как в VC размер float-а четыре байта, то есть VC приводит float к double. Я бы сделал по другому, в базовом классе, в секции protected:, создал инлайновый метод доступа к координатам, таким образом без разницы в каком виде хранятся координаты. ЗЫ. XilinX --- хороший ник |
Сообщ.
#5
,
|
|
|
Я так понял, фишка в том, что декларацию базового класса менять нельзя?
|
Сообщ.
#6
,
|
|
|
Еще раз перечитал вопрос. Видимо да, массив в базовом классе, и нужно в дочернем классе сделать структуру поверх массива в базовом классе. Разумеется так нельзя, папа и сын не могут иметь одну общую руку.
Массив фиксированного размера, можно попробовать через дефайны #define _X_ (CBase::mCoord[0]) #define _Y_ (CBase::mCoord[1]) #define _Z_ (CBase::mCoord[2]) |
Сообщ.
#7
,
|
|
|
Странно, я объявляю функцию как inline, однако просматривая ассемблерный код, вижу тот-же call
|
Сообщ.
#8
,
|
|||
|
Ты уверен, что нельзя? |
Сообщ.
#9
,
|
|||||||
|
Вообще, inline является рекомендацией компилятору встроить код. Компилятор сам выбирает, может он встроить функцию или нет. Во всех компиляторах, которые я видел, есть настройка 'запретить встраивание inline функций', и эта настройка по умолчанию часто бывает установлена. Добавлено в
На сколько я понимаю, это противоречит одной из основных концепций ООП --- инкапсуляции. Может я ошибаюсь, откуда у тебя такая идея взялась? |
Сообщ.
#10
,
|
|||
|
Вот что сказано у Страуструпа про встраиваемые функции.
|
Сообщ.
#11
,
|
|
|
Идея отсюда:
Существует базовый класс, описывающий n-мерный вектор. Дочерний клас описывает 3-х мерный вектор. В базовом классе компоненты вектора живут в Coord[n], хотелось бы реализовать доступ к ним как к полям структуры из дочернего класса. Обращение к полю структуры, это просто mov, а еслт делать функцию float& X(), то это намного больше операций. |
Сообщ.
#12
,
|
|||||
|
Базовый класс твой?
А если проверить? |
Сообщ.
#13
,
|
|
|
В общем, не знаю что у тебя за компилятор,
VC, в release, с оптимизацией по скорости, делает абсолютно одинаковый код для struct m_Struct { float x, y, z; } m_Struct; float m_Coord[3]; inline float & Get_X() { return m_Struct.x; } именно, доступ в одну строчку с индексным методом адресации относительно адреса объекта fld DWORD PTR [ecx+8] или mov DWORD PTR [ecx+8], edx |
Сообщ.
#14
,
|
|
|
Компилятор у меня VC (.NET) и вместо inline-подстановки он вставляет call
|
Сообщ.
#15
,
|
|||
|
Release? Оптимизацию включал? Обрати внимание на последний абзац в цитате Страуструпа |
Сообщ.
#16
,
|
|
|
Сообщ.
#17
,
|
|
|
Ни у кого никаких идей?
|
Сообщ.
#18
,
|
|
|
Может нужно не отладочную (debug) версию собирать, а конечную (release)
Тут ни у кого нет ни каких обязанностей перед тобой, так что 'пожалуйста', с твоей стороны, было бы в самый раз. |
Сообщ.
#19
,
|
|||
|
И как ты себе представляешь последнее мое сообщение? Пожалуйста, ни у кого никаких идей? или Пожалуйста, идейку плииизз, умираю....... больше походит на какоето клянчание. Я же задаю реальный вопрос, и не потому, что мне позарез необходим ответ, а потому, что это интересный случай (не только для меня). И я не понимаю, что тебя так задело? Я никогда даже и не намекал, что кто-то тут мне что-то должен. |
Сообщ.
#20
,
|
|
|
Ну ты даешь
Тебе три раза на этой странице сказано: собирай release |
Сообщ.
#21
,
|
|||||
|
Нет, идей нет. Странный глюк обычно там все есть. Ты уверен, что это не пустой проект? А в других проектах показывает?
Да все нормально ты написал, не понимаю что у MeG'a за претензии. |
Сообщ.
#22
,
|
|
|
Я УВЕРЕН, что это не пустой прект..... в других тоже самое.
MeG, при чем тут release, вопрос не в этом..... |
Сообщ.
#23
,
|
|||
|
Значит студия кривая. Попробуй переустановить. Вот и все идеи. |