Указатель на член - элемент массива
Ты б хоть язык указал.
это что за аццкий с++ !?
До тех пор пока ты не ввел ни одной переменной типа S ты не можешь обращаться к ее(?) внутренностям. Это же самые начала ООП.
![](/images/graemlins/ooo.gif)
Получить указатель на член, который указывал бы на первый элемент массива этой структуры. Чтобы с его помощью в дальнейшем можно было для любого экземпляра этой структуры обращаться к первому элементу массива (S s; s.*ptr=17; )
мехмат?
![](/images/graemlins/smile.gif)
struct S {Но вообще-то это жесть
int arr[8];
}
...
int S::* ptr = reinterpret_cast<int S::*>(&S::arr);
S s;
s.*ptr = 15;
std::cout << s.arr[0] << std::endl; // Выведет 15
...
![](/images/graemlins/laugh.gif)
struct S{что это за нах?
int arr[8];
}
...
int S::*ptr;
ptr=&S::arr[0];
...
Пиши русским языком!
![](/images/graemlins/mad.gif)
struct S
{
int arr[8];
};
...
S test;
int *ptr;
ptr=&test.arr[0];
...
Нужно было несколько другое.
а что нужно было-то?
Чтобы [..] в дальнейшем можно было для любого экземпляра этой структуры обращаться к первому элементу массива (S s; s.*ptr=17;)
S s1, s2;И т.п.
s1.*ptr = 10; // == s1.arr[0]
s2.*ptr = 12; // == s2.arr[0]
ptr=&test.arr[0];Да ну вы все извращенцы.
![](/images/graemlins/grin.gif)
В C имя массива само по себе является указателем на его первый элемент.
Ты, другими словами, хочешь создать алиас для элемента массива, где массив — это поле структуры. Но такого нельзя сделать даже для самого поля, не говоря уж об энном элементе массива. Можно взять физический адрес или указатель на член класса только для конкретного экземпляра.
Ты, другими словами, хочешь создать алиас для элемента массива, где массив — это поле структуры.Начнём с того, что хочу не я.
Но такого нельзя сделать даже для самого поля, не говоря уж об энном элементе массива.Для самого поля это сделать можно в С++ (получить и сохранить смещение поля внутри структуры). Попробуй скомпилировать код, который я привел, и разобраться в нём.
Можно взять физический адрес или указатель на член класса только для конкретного экземпляра.Ну вот, ты не знаешь, а говоришь. Плюсик тебе за распространение заведомо ложной информации.
![](/images/graemlins/smile.gif)
Начнём с того, что хочу не я.извини, не туда пост приклеил.
Честно говоря, уже не помню, является ли допустимой по стандарту операция
p = S::*f;где f — поле структуры, или нужно делать через экземпляр. Но в любом случае, можно взять поинтер на сам массив, считая, что это и есть его нулевой элемент. Дальше — смещение на размер элемента (грязновато, конечно).
p = S::*f;вряд ли
но в вышеупомянутом коде такой операции нет
struct S{
int arr[8];
}
...
int S::*ptr;
ptr = S::arr;
...
?
reinterpret_cast<int S::*>как известно код с reinterpret_cast является заведомо не портируемым (корректным синтаксически, но некорректным функционально)
а это не будет работать - arr не static
а это не будет работать - arr не staticи что?
Где в коде намек на то, что он должен быть static?
По мнению многих сексопатологов указателем на член является мужской галстук.
![](/images/graemlins/smile.gif)
не скомпилируется
все это очень хорошо иллюстрирует, что C++ - говно.
PS: Не стОит использовать тупые фичи (типа указателей на нестатические члены класса если сами авторы языка их еще до конца не продумали или авторы самых распространенных компиляторов не реализовали. Не надо добавлять на свою голову проблем.
не скомпилируетсязнаю
это впрочем вовсе не означает, что код неверный (как и код автора в первом посте хотя это может быть и так.
раз в коде явно(статически) указан размер массива значит его надо и дальше везде указывать явно
int * arr и int arr[8] - это разные типы
struct S{
int arr[8];
int q;
};
typedef int (IntArray8)[8];
int main(array<System::String ^> ^args)
{
IntArray8 S::*ptr = &S::arr;
S obj;
obj.arr[0] = 5;
std::cout << (obj.*ptr)[0] << std::endl;
return 0;
}
Но элемент-то массива - это int в любом случае. А нужно мне это вот для чего. В реальной задаче массив многомерные, а мне надо пройтись по набору таких структур и произвести операцию над определенными (везде одними и теми же) элементами массива. Хотелось бы сделать это наиболее красиво и эффективно. Обращение по нескольким индексам естественно медленнее, чем разыменовывание указателя на член, но я не смог записать получение указателя на член, являющийся элементом массива, и поинтересовался, возможно ли это вообще (здравый смысл подсказывает, что возможно, так же как указатель на int может указывать на элемент массива интов). И столкнулся с непониманием. reinterpret_cast и тому подобное нежелательны, т.к. концепция указателя на член, как я понимаю, и выступает альтернативой херне типа
#define OFFSET(STRUCT,FIELD) int &*(STRUCT*0.FIELD )
т.е. фактически получается, что, например, для описания
struct Point
{
int x;
int y;
};
struct S{
int arr[8];
Point p;
};
ты хочешь получить смещение для p.y относительно S.
afaik, C++ в явном виде такое записывать не умеет.
Нет, я хочу получить смещение элемента массива относительно внешней структуры. В данном случае - смещение arr[0] относительно S. Но вообще похожие ситуации. А что значит в явном виде? Как ещё?
Как ещё?допустим так:
S s;
int offset = (char*)&s.arr[1] - (char*)&s;
И что потом с offset делать?
ты хочешь получить смещение для p.y относительно S.Можно так:
Point S::* Sptr = &S::p;
int Point::* Pptr = &Point::x;
Point p = {1, 2};
S d;
d.*Sptr.*Pptr = 10;
![](/images/graemlins/smile.gif)
S ss[10];
for (int i = 0; i < 10; ++i)
*int*char*)&(ss[i] + offset = i;
но в этом коде два смещения, соответственно которые каждый раз складываются.
хочется именно одно смещение для оптимизации производительности
чем тебя дейфайны с тайп кастами не устраивают?
(char*)Тебя умные книжки еще не научили, что такое преобразование типа использовать в C++ крайне нежелательно (на его месте компилятор поставит static_cast, const_cast, reinterpret_cast - что первым подойдет из этой последовательности)?
ты пишешь не на C++, а на C для компилятора C++
![](/images/graemlins/blush.gif)
интересно, а ты понимаешь почему это нежелательно?
![](/images/graemlins/laugh.gif)
или только пересказываешь умные книжки?
![](/images/graemlins/smirk.gif)
PS: не знаю как кто, а лично я книжки по языкам программирования читаю не для того, чтобы их зубрить и пересказывать, а чтобы вникать в логику соответствующего ЯП.
![](/images/graemlins/smile.gif)
дальновидные программисты не используют const_castИ почему же?
ах да, ты прав, уже из содержимого твоего поста видно что в "почему" ты не въехал, а просто зазубрил умную книжкубез аргументации это есть голословный наезд
И почему же?очевидно потому, что константный указатель может указывать на read only область памяти (стандарт и Страуструп это разрешают)
к сожалению, C/C++ - это не тот язык, "приколы" которого хочеться помнить...
к сожалению, C/C++ - это не тот язык, "приколы" которого хочеться помнить...нет языка C/C++
есть язык C и язык C++ - два совершенно разных языка
соглашусь с утверждением, что C++ - не тот язык, приколы которого хочется помнить
но тем не менее если программируешь на каком-то языке, то его приколы помнить обычно необходимо (как минимум приколы той функциональности, которую непосредственно используешь).
мне можно не помнить
![](/images/graemlins/smile.gif)
(на его месте может быть поставлено static_cast, const_cast, reinterpret_cast - что первым подойдет из этой последовательности)Слишком громоздко и из-за этого некрасиво.
если слишком громоздко и некрасиво, то можно не писать на C++(на его месте может быть поставлено static_cast, const_cast, reinterpret_cast - что первым подойдет из этой последовательности)Слишком громоздко и из-за этого некрасиво.
![](/images/graemlins/smile.gif)
Я так понял требуется уточнение: цитата в скобках говорит НЕ о том, что программист может сделать (как я уже говорил const_cast, reinterpret_cast будут ставить только неумные программисты а о том, что компилятор будет делать, когда встретит C-шный синтаксис преобразования типа.
т.е. замечание в скобках следует читать так:
вместо (some_type)Val компилятор поставит static_cast<some_type>(Val const_cast<some_type>(Val reinterpret_cast<some_type>(Val) - что первым подойдет из этой последовательностии отсюда и очевидно почему C-шный синтаксис (some_type)Val не стОит использовать, а именно из за возможности пулучить const_cast или reinterpret_cast
Оставить комментарий
Dmitriy82
Ругается на последнюю строчку subscript requires array or pointer type.
Возможно ли, и если да то как правильно записать то, что я имел ввиду (указатель на первый элемент массива)?