S>Почему?
А что за странное преобразование типов ты устроил? Естественно у тебя падает приложение, потому что ты передаешь объект совсем другого типа, и обманываешь компилятор.
class A
{
public:
char str[255];
};
void f(A &a, char (A::*)[255])
{
}
int main()
{
A a;
f(a, &A::str);
return 0;
}
Да здравствует мыло душистое и веревка пушистая.
Re: Не работает преобразование типов указателей на члены кла
Здравствуйте, Slowspeed, Вы писали:
S>Попытка вызова OutputDebugString вызывает ошибку доступа к памяти. S>Почему?
Потому что фактический тип члена — char[255], а у тебя указатель на член типа char*
Соответственно, первые четыре символа трактуются как указатель на строку.
Кстати, если компилятор ругается на несовместимость типов, то надо исправлять типы, а не затыкать реинтерпрет-кастом. Кривой реинтерпрет — дорога в ад.
В крайнем случае, можно было бы приводить к указателю на односимвольный массив. Для работы со строками размер массива не важен.
А ещё лучше — заменить голое замыкание ->* функцией char*(A*)
Да, вижу, ступил.
В более общем виде задача у меня такая:
Есть список структур, в каждой структуре несколько символьных массивов разного размера.
Надо пройти по списку несколько раз и для каждой структуры вызвать некоторую функцию обработки строки.
Причем в каждом проходе обрабатывать другой массив.
т.е.
struct TS
{
char s1[255];
char s2[512];
...
}
В первом проходе обработать все строки s1, во втором все строки s2, итд.
Я планировал передавать функции обработки указатель на структуру и указатель на член класса,
меняя указатель на член класса перед каждым проходом.
Но из-за разной длины строк я не могу вторым параметром функции сделать массив, поэтому хотел сделать
его каким-нибудь указателем. Можно, конечно, задать параметром массив фиксированной длины и приводить
к его типу указатель на член класса перед каждым проходом, но хотелось бы что-нибудь поизящней.
Re[3]: Не работает преобразование типов указателей на члены
Здравствуйте, Slowspeed, Вы писали:
S>Есть список структур, в каждой структуре несколько символьных массивов разного размера.
Указатели на члены позволяют сочетать фактические объекты-наследники и фактические члены-предки, в том числе, в условиях непростого наследования (со сдвигом баз).
Если этого не нужно, — если структуры все POD, — то можно сделать просто, на смещениях:
Сишный подход