Dziwny błąd wywoływania konstruktora

0

Mój program jest dość długi dlatego nie zdecydowałem się zamieścić go w poście. Po próbie kompilacji poniższego kodu dostaję błąd (oczywiście main_skeleton.h to biblioteka załączona do main.cpp )

13	104	C:\Users\Lenovo\Desktop\GE\main.cpp	[Error] new initializer expression list treated as compound expression [-fpermissive]
13	104	C:\Users\Lenovo\Desktop\GE\main.cpp	[Error] no matching function for call to 'ENGINE::ENGINE(int)'
13	104	C:\Users\Lenovo\Desktop\GE\main.cpp	[Note] candidates are:
25	7	C:\Users\Lenovo\Desktop\GE\main_skeleton.h	[Note] ENGINE::ENGINE()
25	7	C:\Users\Lenovo\Desktop\GE\main_skeleton.h	[Note] candidate expects 0 arguments, 1 provided

Kompilator sugeruje, że próbuję wywołać konstruktor klasy ENGINE z jednym argumentem podczas gdy nie przyjmuje on żadnych argumentów. Ale w lini 13 wywołuję konstruktor w taki sposób

_pGame = new ENGINE(hInstance, TEXT("ENGINE"), TEXT("ENGINE"), IDI_SKELETON, IDI_SKELETON_SM, 640, 480); 

,a definicja konstruktora klasy ENGINE wygląda tak

ENGINE(HINSTANCE, LPTSTR, LPTSTR, WORD, WORD, int, int);

Czy ktoś może mi wyjaśnić ten dziwny błąd?

0

Co można spieprzyć w C/C++ i mieć mętne komunikaty?
Praktycznie wszystko.

Jest w pozostałym kodzie coś "śmiesznego", np głupie #define, średnik gdzie nie trzeba, itd... Czyste domniemanie & intuicja, na podstawie setek podobnych błędów.

0

na podstawie tego: https://stackoverflow.com/a/4281917/1387438
domyślam się, że jeden z symboli: HINSTANCE, LPTSTR, LPTSTR, WORD nie jest znany.
Prawdopodobnie brakuje #include <Windows.h>, albo pomieszałeś kolejność #include

0

Po pierwsze, nie podałeś nawet jakiego używasz kompilatora. To czasami istotne.

Jeżeli wywołanie konstruktora rzeczywiście wygląda tak:

_pGame = new ENGINE(hInstance, TEXT("ENGINE"), TEXT("ENGINE"), IDI_SKELETON, IDI_SKELETON_SM, 640, 480); 

to „coś jest nie tak”. Komunikat new initializer expression list treated as compound expression jest bardzo podejrzany.
Ale pokazałeś raczej za mało kodu żeby stwierdzić z pewnością dlaczego kompilator się gubi i daje takie dziwne komunikaty.

0

kq, dziękuję ci za twoje uwagi i postaram się je zastosować następnym razem kiedy stworzę temat. Tymczasem może sprecyzuję pytanie:
Sprawa wcale nie jest taka prosta, w moim programie nie używam define'ów , a chyba nie ma innej instrukcji w c++, kóra mogłaby przed kompilacją zmienić zawartość pliku źródłowego. Dlaczego więc kompilator uważa, że w linii 13 odwołuję się do ENGINE::ENGINE(int) ? Winows.h jest załączone, sprawdziłem. Co może powodować taki błąd? Podajcie chociaż 1 z owego miliona możliwych przyczyn

edit:

używam środowiska orwell dev c++ 5.11
kompilator MINGW64

1

Nazywanie klas WIELKIMI_LITERAMI to proszenie się o kłopoty, szczególnie jeśli załączasz "obce" nagłówki.
Zmień nazwę na Engine i sprawdź czy dalej są problemy.

0

Zmieniłem nazwę klasy z ENGINE na Tengine. Kiedy klikam Ctrl+Klik na to:
'''
Tengine * _pGame;
'''
kompilator sam mnie przenosi w miejsce gdzie stworzyłem klasę Tengine, ale przy kompilacji wywala mi
7 1 C:\Users\Lenovo\Desktop\GE\main.cpp [Error] 'Tengine' does not name a type

0

Kodu jest dużo więc wrzuciłem na githuba - https://github.com/aannttoonnii13/Win32_game_engine

1

Zmień kodowanie plików na UTF8.
Nie definiuj klas plikach h.
Podziel to jakoś na cpp i h/hpp.
Static variable m_pEngine musisz zdefiniować przed użyciem nullptr. Np tak

Tengine * Tengine::m_pEngine = nullptr;

Do plików h dodaj guardy.

Po tych zmianach co wyżej opisałem ładnie się kompiluje i działa :)

1

W konstruktorze zamień LPTSTR na LPCTSTR.

0

OK, dziękuję wszystkim teraz działa, wystarczyło tylko zmienić rozszerzenia plików z h na hpp i zainicjalizować m_pEngine nullptr

edit:
Jak zamknąć temat?

1 użytkowników online, w tym zalogowanych: 0, gości: 1