Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.144.35.148] |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#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? Оптимизацию включал? Обрати внимание на последний абзац в цитате Страуструпа |