Dr.Yevhenius
|
|
« : 24-12-2009 06:27 » |
|
Есть некий класс: class A { public: void foo() { printf("dfsa"); } };
Ниже пишу: A a(); a.foo();
но выдает D:\Eugene\Temp\w32ca\w32ca.cpp(176) : error C2228: left of '.foo' must have class/struct/union type . Почему? Разве А не класс? P.S. Использую: #include <stdafx.h> #include <iostream> #include <afx.h> #include <fstream.h> #include <windows.h> #include <string.h>
У меня Microsoft Visual Studio 6.0
|
|
« Последнее редактирование: 26-12-2009 06:23 от Inkognito »
|
Записан
|
|
|
|
Вад
|
|
« Ответ #1 : 24-12-2009 06:38 » |
|
Классические грабли Компилятор принимает код A a();
за объявление функции. Надо A a;
|
|
« Последнее редактирование: 24-12-2009 06:40 от Вад »
|
Записан
|
|
|
|
Dr.Yevhenius
|
|
« Ответ #2 : 24-12-2009 07:04 » |
|
Вот вообще тот класс (тела методов убрал, они тут без нужды), из-за которого весь сырбор: class Lister2 { public: Lister2():target(0), end(true), file(1) {}
~Lister2() { delete target; }
int getFile() const { return file; }
void set(string & target_path) { }
BOOL next(string & where, int proc, string & get) { return end; } protected: Lister2(const Lister2 & original) {} private: CFileFind cff; string * target; BOOL end; int file; };
() убрал. Ошибки left of ... must have class/struct/union type больше нету, спасибо. Но не все так хорошо, как хотелось бы. Получил следующее: nafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) already defined in LIBCD.lib(new.obj) nafxcwd.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) already defined in LIBCD.lib(dbgdel.obj) nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex Debug/w32ca.exe : fatal error LNK1120: 2 unresolved externals
Всё это выводит при попытке создать экземпляр класса Lister2 list;
Что теперь не так? _______________________________________ А, всё, нашел: вся проблема с CFileFind cff;. Поменял на указатель.
|
|
« Последнее редактирование: 24-12-2009 07:12 от Inkognito »
|
Записан
|
|
|
|
Dr.Yevhenius
|
|
« Ответ #3 : 24-12-2009 07:16 » |
|
Всё-равно какая-то ерунда: при попитке cff = new CFileFind;
выдает нагора при первом компилировании:nafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) already defined in LIBCD.lib(new.obj) nafxcwd.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) already defined in LIBCD.lib(dbgdel.obj) nafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int,int,char const *,int)" (??2@YAPAXIHPBDH@Z) already defined in LIBCD.lib(dbgnew.obj) nafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) already defined in LIBCD.lib(new.obj) nafxcwd.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) already defined in LIBCD.lib(dbgdel.obj) nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex Debug/w32ca.exe : fatal error LNK1120: 2 unresolved externals
при следующих компиляциях:nafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) already defined in LIBCD.lib(new.obj) nafxcwd.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) already defined in LIBCD.lib(dbgdel.obj) nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex Debug/w32ca.exe : fatal error LNK1120: 2 unresolved externals
Что опять не слава Богу? P.S. На int * a = new int;
подобного не выдает, хотя по сути это одно и то же, только типы разные... (Это что же получается: нельзя динамически создавать CFileFind? )
|
|
« Последнее редактирование: 24-12-2009 07:19 от Inkognito »
|
Записан
|
|
|
|
Вад
|
|
« Ответ #4 : 24-12-2009 07:23 » |
|
_beginthreadex используешь? Библиотеки какие-нибудь дополнительно к проекту линкуешь? Похоже на конфликт 2х версий стандартной библиотеки (отладочной и релизной или многопоточной и однопоточной).
|
|
|
Записан
|
|
|
|
Dr.Yevhenius
|
|
« Ответ #5 : 24-12-2009 07:27 » |
|
Использую только #include <stdafx.h> #include <iostream> #include <afx.h> #include <fstream.h> #include <windows.h> #include <string.h>
Никаких lid или dll или еще чего к проекту не подключал. _beginthreadex в моем коде нету. Мог бы выложить код, но там 325 строк ...
|
|
« Последнее редактирование: 24-12-2009 07:29 от Inkognito »
|
Записан
|
|
|
|
Вад
|
|
« Ответ #6 : 24-12-2009 07:33 » |
|
А что такое класс CFileFind? MFC? Возможно, где-то из MFC просочилась многопоточность.
|
|
|
Записан
|
|
|
|
|
lapulya
Молодой специалист
Offline
|
|
« Ответ #8 : 24-12-2009 15:58 » |
|
Inkognito, если твою программу укоротить до такого (т.е. убрать ВСЕ):
class A {};
int main() { A a; return 0; }
что скажет компилер и линкер?
|
|
|
Записан
|
С уважением Lapulya
|
|
|
Dr.Yevhenius
|
|
« Ответ #9 : 25-12-2009 12:42 » |
|
--------------------Configuration: w32ca - Win32 Debug-------------------- Compiling... w32ca.cpp Linking...
w32ca.exe - 0 error(s), 0 warning(s)
Впрочем, как и любой другой Microsoft Visual Studio 6.0
|
|
« Последнее редактирование: 25-12-2009 12:44 от Inkognito »
|
Записан
|
|
|
|
lapulya
Молодой специалист
Offline
|
|
« Ответ #10 : 25-12-2009 14:07 » |
|
Inkognito, а все свои инклуды вставил? Кстати я надеюсь, что ты не создал новый проект с предложенным мной исходником, а использовал свой "проблемный".
Что за библиотека LIBCD, кто добавил, зачем добавил, кто писал, что внутри?
|
|
« Последнее редактирование: 25-12-2009 14:10 от lapulya »
|
Записан
|
С уважением Lapulya
|
|
|
Вад
|
|
« Ответ #11 : 25-12-2009 14:08 » |
|
Раз внешних библиотек самостоятельно не добавлялось - думаю, проблема в где-то в линковке с MFC.
|
|
|
Записан
|
|
|
|
Dr.Yevhenius
|
|
« Ответ #12 : 25-12-2009 19:49 » |
|
Inkognito, а все свои инклуды вставил?
Да, все. Кстати я надеюсь, что ты не создал новый проект с предложенным мной исходником
Конечно же нет. А зачем? Что такого ты делаешь в коде? A a; написал верно, CFileFind динамически не создаешь. Смысл компилить твой код... Что за библиотека LIBCD, кто добавил, зачем добавил, кто писал, что внутри?
lapulya, откуда мне знать, кто добавил LIBCD в afxmem.obj? Использую только #include <stdafx.h> #include <iostream> #include <afx.h> #include <fstream.h> #include <windows.h> #include <string.h>
Никаких lid или dll или еще чего к проекту не подключал.
|
|
« Последнее редактирование: 25-12-2009 19:51 от Inkognito »
|
Записан
|
|
|
|
lapulya
Молодой специалист
Offline
|
|
« Ответ #13 : 25-12-2009 20:41 » |
|
Inkognito, Смысл компилить - понять на что орет линкер. Именно поэтому надо использовать существующий проект, а не создавать новый. В твоем текущем проекте (тот что не линкуется) залинкована библиотека LIBCD (хотя ты говоришь, что ничего не линковал, но у линкера на этот счет другое мнение), вот я и спрашиваю что это за хрень? Если ты создал новый проект, то там естественно никакой LIBCD нет, поэтому то и проблемы нет, поэтому и компилить мой пример в новом проекте смысла нет. откуда мне знать, кто добавил LIBCD в afxmem.obj? эту фразу я вообще не понял. Кстати, можно грохнуть LIBCD из проекта и посмотреть, на что будет орать анресолвед экстернал симбол.
|
|
|
Записан
|
С уважением Lapulya
|
|
|
Вад
|
|
« Ответ #14 : 25-12-2009 22:04 » |
|
Куда грохнуть libcd? это же отладочная LIBC. Она по дефолту включается, с ней не должно быть проблем с самой по себе. А afx*.obj - это MFC-шные, насколько я понимаю. Вот где-то здесь и проблема: будто в MFC одна версия библиотеки LIBC слинкована, а в проекте - другая.
Inkognito, как ты подключал MFC - мастером создавал MFC-проект? Были ещё какие-то манипуляции с проектом и mfc?
|
|
« Последнее редактирование: 25-12-2009 22:06 от Вад »
|
Записан
|
|
|
|
Dr.Yevhenius
|
|
« Ответ #15 : 26-12-2009 00:17 » |
|
Это у меня вообще Win32 Console Application. Не стояло сюда MFC пихать? CFileFind убрал з кода полностью. Заменил его с помощью WIN32_FIND_DATA, FindFirstFile, FindLastFile. Вот функция, котороя ищет файл: // Знайти наступний файл bool next(string path, string & get, int process = 0) { if(neoc) { nowfilenumber = 0; isFound = true;
WIN32_FIND_DATA w32FileData; HANDLE hSearch; BOOL isFirst = TRUE; // Шукаємо файл з потрібним номером while(true) { if(isFirst) { // Намагаємося знайти перший файл hSearch = FindFirstFile(target.c_str(), &w32FileData); if(hSearch == INVALID_HANDLE_VALUE) isFound = false; isFirst = FALSE; } else { // Шукаємо наступний файл isFound = (bool)FindNextFile(hSearch, &w32FileData); }
if(!isFound) // Якщо не знайшли, то в цій папці шукати більше // нічого break; isFound = false; // Файл знайшли, але він нам не підходить по // номеру (або підходить: перевірка зразу нижче)
// Перевіряємо, чи це не папка if(w32FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { // Переходимо всередину папки string path_temp = path; path_temp += "\\*.*"; // Власне, перехід next(path_temp, get, process + 1); // Чи знайдений файл після рекурсії? if(isFound) return true; } else { ++nowfilenumber; // Знайшли новий файл if(nowfilenumber > lastfilenumber) // Якщо це той файл, // який ми шукали { // Ініціалізуємо номер останнього відкритого файла lastfilenumber = nowfilenumber; // Ініціалізуємо шлях до файла get = path; get += w32FileData.cFileName; // Файл знайдено! isFound = true;
cout << get.c_str() << endl; // Добавил для отладки; в конечном варианте этого не будет
return true; } } }
// Якщо навіть початковий процес не знайшов файл, то шукати // тут більше нічого: або всі файли вже опрацьовані, або // ціль задано невірно if((!isFound) && (process == 0)) neoc = false; }
return neoc; }
Но вот проблема: код if(w32FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { // Переходимо всередину папки string path_temp = path; path_temp += "\\*.*"; // Власне, перехід next(path_temp, get, process + 1); // Чи знайдений файл після рекурсії? if(isFound) return true; }
не работает, как должен. То есть он не заходит внутрь подпапки, а просто добавляет символ "\" в конец путя... Пока не сможет найти какое_то_имя_папки\\. Подскажите пожалуйста, как мне зайти внутрь подпапки для поиска там файлов (и подпапок)?
|
|
« Последнее редактирование: 26-12-2009 06:00 от Inkognito »
|
Записан
|
|
|
|
Dr.Yevhenius
|
|
« Ответ #16 : 26-12-2009 05:59 » |
|
Разобрался сам . Код исправил. Работающая функция поиска файлов/папок: bool next(string path, string & get, int process = 0) { if(neoc) { nowfilenumber = 0; isFound = true;
WIN32_FIND_DATA w32FileData; HANDLE hSearch; BOOL isFirst = TRUE; // Шукаємо файл з потрібним номером while(true) { if(isFirst) { string path2 = path; if(process != 0) path2 += "*.*"; // Намагаємося знайти перший файл hSearch = FindFirstFile(path2.c_str(), &w32FileData); if(hSearch == INVALID_HANDLE_VALUE) isFound = false; isFirst = FALSE; } else { // Шукаємо наступний файл isFound = (bool)FindNextFile(hSearch, &w32FileData); }
if(!isFound) // Якщо не знайшли, то в цій папці шукати більше // нічого break; isFound = false; // Файл знайшли, але він нам не підходить по // номеру (або підходить: перевірка зразу нижче)
// Перевіряємо, чи це не папка if(w32FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { // Пропускаємо "." і ".." if((strcmp(w32FileData.cFileName, ".") == 0) || (strcmp(w32FileData.cFileName, "..") == 0)) continue; // Переходимо всередину папки string path_temp = path; path_temp += "\\"; // Власне, перехід next(path_temp, get, process + 1); // Чи знайдений файл після рекурсії? if(isFound) return true; } else { ++nowfilenumber; // Знайшли новий файл if(nowfilenumber > lastfilenumber) // Якщо це той файл, // який ми шукали { // Ініціалізуємо номер останнього відкритого файла lastfilenumber = nowfilenumber; // Ініціалізуємо шлях до файла get = path; get += w32FileData.cFileName; // Файл знайдено! isFound = true;
return true; } } }
// Якщо навіть початковий процес не знайшов файл, то шукати // тут більше нічого: або всі файли вже опрацьовані, або // ціль задано невірно if((!isFound) && (process == 0)) neoc = false; }
return neoc; }
Вад, за Классические грабли
спасибо.
|
|
« Последнее редактирование: 26-12-2009 06:23 от Inkognito »
|
Записан
|
|
|
|
lapulya
Молодой специалист
Offline
|
|
« Ответ #17 : 26-12-2009 12:00 » |
|
Сорри, я не знал, что LIBCD отладочная библиотека. Но суть дела не меняется, надо было разобраться на что орал линкер, т.е. понять какие либы конфликтуют и кто и как добавил их в проект.
|
|
|
Записан
|
С уважением Lapulya
|
|
|
Вад
|
|
« Ответ #18 : 26-12-2009 21:32 » |
|
lapulya[/b], ну, из слов топикстартера Это у меня вообще Win32 Console Application. Не стояло сюда MFC пихать? я могу заключить, что надо смотреть, как именно был прилеплен к проекту MFC. Возможно, каким-то нетрадиционным способом
|
|
|
Записан
|
|
|
|
lapulya
Молодой специалист
Offline
|
|
« Ответ #19 : 27-12-2009 22:51 » |
|
Вад, Угу, то он это после моего поста написал, а так со всем согласная я
|
|
|
Записан
|
С уважением Lapulya
|
|
|
|