OOP



  • Hi Leute!

    Wollte grad mal OOP in c++ machen, nur will das nich so wie ich
    will.

    ich schreib mir ein Klasse in einer header

    #ifndef _TANK_H
    #define _TANK_H
    class Tank
    {
    private:
    	float m_Volume;
    public:
    	Tank()
    	{
    		m_Volume=1000.0f;
    	}
    	float getVolume();
    };
    #endif
    

    dann mach ich mir ne cpp-datei

    #include "tank.h"
    
    float Tank::getVolume()
    {
    	return m_Volume;
    }
    

    so und nun binde ich das in meine programm ein, aber er gibt mir ständig fehler
    meldungen wie

    ank.obj : error LNK2005: "public: float __thiscall Tank::getVolume(void)" (?getVolume@Tank@@QAEMXZ) already defined in oop.obj
    Debug/test oop.exe : fatal error LNK1169: one or more multiply defined symbols found

    wenn ich alles in die header daeit schreibe und dann in mein programm einbinde
    gehts. bin recht ratlos:(

    vielleicht wisst ihr waum, danke schonmal



  • ich glaub du hast es mit der Ordnung übertrieben 😃 :

    [code]class Tank
    {
    private:
        float m_Volume;
    public:
        Tank()
        {
            m_Volume=1000.0f;
        }
        float getVolume();
    };
    [/code]
    

    und

    [cpp]#ifndef _TANK_H
    #define _TANK_H
    #include "tank.h"
    
    float Tank::getVolume()
    {
        return m_Volume;
    }
    #endif[/cpp]
    

    oder lass mal das #ifndef #define und#endif mal ganz weg.
    funzt es dann?



  • wenn ich

    #ifndef _TANK_H
    #define _TANK_H
    
    Klasse
    
    #endif
    

    weglasse gehts auch nicht, soll nur vor mehrfach includierung schützen.

    das mein header.

    dann kommt meine tank.cpp

    #include "tank.h"
    
    float Tank::getVolume()
    {
    	return m_Volume;
    }
    

    und dann meine main

    #include <iostream.h>
    #include "Tank.cpp"
    
    float main()
    {
    	Tank myTank;
    	cin.get();
    	return 0;
    }
    


  • Sorry, ESS_CB, aber was du geschrieben hast, ist vollkommener Blödsinn.

    adonis, dein erster Entwurf war vollkommen korrekt. Aber du darfst die Tank.cpp nicht inkludieren.

    Edit: Wenn wir schon mal dabei sind:

    Bitte <iostream> statt <iostream.h>

    und std::cin statt cin



  • Das Problem kenne ich. Ich benutze Visual c++ .NET, den Spass habe ich oefters. Wenn ich das ganze in DevCpp mache klappts. Ich denke das ist'n Bug, da nicht mal ein komplettes rebuilt was nutzt. Lösch' mal die .obj von Hand, und probiers dann nochmal



  • bumbytie schrieb:

    Das Problem kenne ich. Ich benutze Visual c++ .NET, den Spass habe ich oefters. Wenn ich das ganze in DevCpp mache klappts. Ich denke das ist'n Bug, da nicht mal ein komplettes rebuilt was nutzt. Lösch' mal die .obj von Hand, und probiers dann nochmal

    Nö, das is kein Bug von VC. Das is vollkommen korrekt!

    grüße



  • ok hab jetzt statt tank.pp die tank.h eingebunden und es geht.
    danke:)

    wo liegt der unterschied bei iostream und iostream.h,
    weiss nicht mehr ob ich mich richtig erinnere die ohne .h
    waren nen fester standart währen die andern ein wenig anders sein können?



  • Die Datei iostream.h gibst im Standard nicht. Richtig, laut Standard ist iostream (ohne .h).

    grüße



  • ich hab jetzt mal beide eingebunden die tank.h und die tank.cpp
    das geht auch und zudem stehen mir die auswahllisten zu verfügung.

    also wenn ich nen objekt erstelle myobject.xxx
    da kommt ja immer ne liste wo ich eine methode auswählen kann.

    wenn ich nur die header einbinde sind die weg.



  • nur die tank.h einbinden!

    die cpp datei stellt eine separate übersetzungseinheit dar, und die darf nicht eingebunden werden.



  • ok:)

    irgendwie is vc++ ein wenig komisch.
    jetzt hab ich sie wieder rausgenommen nun hat er die methodenlisten.

    danke für eure hilfe.

    erster meilenstein geschafft hehe


Anmelden zum Antworten