error C2011: 'class' type redefinition -> nicht mit #IFNDEF zu lösen



  • Hallo,
    ich versuche ein einfaches Winapi Fenster von C in C++ umzuprogrammieren, Hab auch gelesen das Winapi nicht C++ fähig ist.

    Allerdings geht es vielleicht so?

    Ich hab eine Start.cpp datei:

    #include <windows.h>
    #include "Start.h"
    //#include "ContentWindow.h"
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
       LPSTR lpCmdLine, int nCmdShow){
    
    	   ContentWindow window;
    
    	   window.init(hInstance, hPrevInstance, lpCmdLine, nCmdShow);
    	 //  wíndow.openWindow();
    
    	   return 0;
    
    }
    

    und den dazugehörigen Header, falls jetzt schon Fehler vorhanden sind bitte sagen, steige gerade erst von Java um.

    Start.h:

    #ifndef START_H_
    #define START_H_
    
    #include "ContentWindow.h"
    
    //int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow);
    
    #endif
    

    Als nächstes hab ich die eigentliche Klasse um das Fenster zu öffnen (ContentWindow.cpp):

    #include <windows.h>
    #include "ContentWindow.h"
    
    class ContentWindow{
    
    	char g_szClassName[20];
    	WNDCLASSEX wc;
    	HWND hwnd;
    	MSG Msg;
    public:
    	ContentWindow(){}
    	~ContentWindow(){}
    
    		int init(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
    	{
    		 g_szClassName  = "myWindowClass";
    		//Step 1: Registering the Window Class
    		wc.cbSize        = sizeof(WNDCLASSEX);
    		wc.style         = 0;
    		wc.lpfnWndProc   = WndProc;
    		wc.cbClsExtra    = 0;
    		wc.cbWndExtra    = 0;
    		wc.hInstance     = hInstance;
    		wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
    		wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
    		wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
    		wc.lpszMenuName  = NULL;
    		wc.lpszClassName = g_szClassName;
    		wc.hIconSm       = LoadIcon(NULL, IDI_APPLICATION);
    
    		if(!RegisterClassEx(&wc)){
    			MessageBox(NULL, "Window Registration Failed!", "Error!",
                MB_ICONEXCLAMATION | MB_OK);
    			return 0;
    	    }
    		openWindow();
    		return 0;
    	}
    
    	int openWindow()
    	{
    		hwnd = CreateWindowEx(
            WS_EX_CLIENTEDGE,
            g_szClassName,
            "The title of my window",
            WS_OVERLAPPEDWINDOW,
            CW_USEDEFAULT, CW_USEDEFAULT, 240, 120,
            NULL, NULL, hInstance, NULL);
    
    		if(hwnd == NULL){
    			MessageBox(NULL, "Window Creation Failed!", "Error!",
                MB_ICONEXCLAMATION | MB_OK);
    			return 0;
    		}
    
    		ShowWindow(hwnd, nCmdShow);
    		UpdateWindow(hwnd);
    
    		return 0;
    
    	}
    };
    

    und der dazugehörige Header (Fehlerhaft?):

    #ifndef CONTENTWINDOW_H_
    #define CONTENTWINDOW_H_
    
    #include "ContentWindow.h"
    
    class ContentWindow{
    	char g_szClassName[20];
    		WNDCLASSEX wc;
    		HWND hwnd;
    		MSG Msg;
    public:
    		ContentWindow();
    		~ContentWindow();
    
    	int openWindow();
    
    	int init(HINSTANCE hInstance, HINSTANCE hPrevInstance,
       LPSTR lpCmdLine, int nCmdShow);
    
    };
    
    #endif
    

    Beim Compilieren mit VC++ 2008 Express krieg ich folgende Fehlermeldung:

    contentwindow.cpp(4) : error C2011: 'ContentWindow' : 'class' type redefinition
    contentwindow.h(6) : see declaration of 'ContentWindow'

    warum ? Ich kanns mir nicht erklären und finde auch im Netz keine Antwort, außer die Anweisung #ifndef #define ... hinzuzufügen, was ich gemacht habe.

    Viele Grüße


  • Administrator

    1. WinAPI ist einfach eine C-Schnittstelle, dass hat nichts mit nicht C++ fähig zu tun. Du kannst mehr oder weniger ohne Probleme über C++ eine C-Schnittstelle ansteuern.
    2. Wir haben allenfalls ein eigenes WinAPI Forum. Falls also fragen zu C++ & WinAPI auftauchen, bitte nicht vergessen in das richtige Forum zu posten.
    3. Dein Post ist allerdings schon richtig, allerdings empfinde ich es ein wenig schwer dir zu helfen, denn einfach gesagt, fehlen dir die Grundlagen! Ich zeig dir mal schnell ein Beispiel, wie die Trennung von Header und Implementation von statten geht:

    // A.hpp
    
    #ifndef H_A_HPP
    #define H_A_HPP
    
    class A
    {
    public:
      void method();
    };
    
    #endif
    
    // A.cpp
    
    #include "A.hpp"
    
    void A::method()
    {
      // ...
    }
    

    Man deklariert im Header und definiert in der *.cpp. Das ist allerdings absolutes Grundlagenwissen.
    Zudem muss man nicht zu jeder *.cpp einen Header haben, deine Start.h ist daher völlig überflüssig.

    Du solltest vielleicht zuerst ein Buch zu C++ lesen oder Tutorials machen. Gute Bücher sind C++ Primer oder Thinking in C++ 1&2. Auch noch anmerken möchte ich, C++ und Java haben sehr wenig gemeinsam! Komm also nicht auf die Fehlannahme, weil du Java kannst, du auch C++ beherrschst oder auch nur teilweise.

    Grüssli



  • Du hast deine Klasse zweimal deklariert, im Header und in der cpp. Nimm die Klassendeklaration aus der cpp raus und definiere dort nur deine Memberfunktionen. So etwa
    ContentWindow.cpp

    #include <windows.h>
    #include "ContentWindow.h"
    
        int ContentWindow::init(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
        {
             g_szClassName  = "myWindowClass";
            //Step 1: Registering the Window Class
            wc.cbSize        = sizeof(WNDCLASSEX);
            wc.style         = 0;
            wc.lpfnWndProc   = WndPr
    ...
    

    Wieso steht in deiner ContentWindow.h nochmal #include "ContentWindow.h" ?



  • Besten Dank an euch Beide!

    Das hilft mir schon weiter.

    @Braunstein: Das steht da fälschlicherweise, habs beim herumprobieren hineingeschrieben.

    viele Grüße

    Knut


Anmelden zum Antworten