Проблема: не могу разобраться, как сделать класс, содержащий член — массив нефиксированной длины. (MS VC++). Если делать массив локально в теле какой-нибудь функции, все работает:
num_files = 0;
char path[255];
GetCurrentDirectory(255, path);
strcat( path, PICTURE_LIST_FILEPATH );
String* dirs[] = Directory::GetFiles(path);
if (Directory::Exists(path))
num_files = dirs->Length;
// Массив нормально создается! // __gc насколько я понимаю здесь использовтать нобязательно,
String *PictureFNames[] = __gc new String*[num_files];
Collections::IEnumerator* myEnum = dirs->GetEnumerator();
int i=0;
while (myEnum->MoveNext())
{
PictureFNames[i] = dynamic_cast<String *>(myEnum->Current); // В массив нормально пишется!
i++;
}
// Из массива нормально читается
String * tmp_string = "";
tmp_string = PictureFNames[1];
Но как только я выношу описание массива в свойства своего класса:
// .H
class TMyPicturesList
{
public:
String *PictureFNames[];
int num_files;
TMyPicturesList();
};
// .CPP
TMyPicturesList::TMyPicturesList()
{
num_files = 0;
char path[255];
GetCurrentDirectory(255, path);
strcat( path, PICTURE_LIST_FILEPATH );
String* dirs[] = Directory::GetFiles(path);
if (Directory::Exists(path))
num_files = dirs->Length;
PictureFNames = __gc new String*[num_files];
Collections::IEnumerator* myEnum = dirs->GetEnumerator();
int i=0;
while (myEnum->MoveNext())
{
PictureFNames[i] = dynamic_cast<String *>(myEnum->Current);
i++;
}
String * tmp_string = "";
tmp_string = PictureFNames[1];
int a = 5; // debug
};
, выдается ошибка:
Cannot declare managed 'PictureFNames' in Unmanageg 'TMyPictureList'.
Массив я вероятно задаю не так, как надо. Пробовал добавить модификатор __gc к описанию класса (это далает его managed?),выдается другая ошибка --
'MyPictureList' : cannot declare a global or static managed type object or a __gc pointer в строке, где объявляется глобальна переменная -- экземпляр моего класса:
TMyPicturesList * MyPictureList = NULL;
В общем, я запутался и разобраться, в чем суть этих managed и не managed данных, и как сделать массивы, у меня не получается.
----------------------------------------------
p.s.
1) знаком с Microsoft Vusial C++ примерно третий день, соответственно это диалект C++ знаю плохо, отсюда мои проблемы.
2) На форуме ответ поискал, не нашел
3) Нет, книги по MS VC++ у меня нет
4) HELP почитал, но не понял
5) сделать поделку нужно срочно, поэтому и не разбираюсь сам, а обращаюсь за помощью.
Здравствуйте, spazhev_dima, Вы писали:
_>Проблема: не могу разобраться, как сделать класс, содержащий член — массив нефиксированной длины. (MS VC++). Если делать массив локально в теле какой-нибудь функции, все работает:
_>В общем, я запутался и разобраться, в чем суть этих managed и не managed данных, и как сделать массивы, у меня не получается.
Старнно у вас как-то объявления выглядят...
А почему бы не объявлять так:
array<System::String^, 1>^ MyStringArray;
MyStringArray = gcnew array<System::String^,1>(myStringCount);
MyStringArray[0] = "asdfasdf";
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Mab>Чего же странного? Это Managed C++.
Иными словами действую в правильном направлении???
Mab>Автору топика -- unmanaged класс не может содержать managed указателей. Используй шаблон gcroot<T>.
Я понимаю, это наглость... Извиняюсь.
А не могли бы вы переделать мой пример -- с использованием gcroot. ДУмаю, это всего несколько строк кода...
А то с утра прошел все книжные нашего родного Бобруйска, толковых книг по теме нет, везде "Библия Notepad", "Internet Eplorer в деталях", "Профессиональная работа в MS PAint"
В общем, я разобрался...
Почитал про gcroot, и все понял...
Спасибо!