c++ Klassen Problem?

Fragen zu allen anderen Programmiersprachen.
Benutzeravatar
gnasen
Beiträge: 578
Registriert: 01.08.2007 14:28
Computerausstattung: PB 4.60

c++ Klassen Problem?

Beitrag von gnasen »

Hi, ich dachte mir, dass es ja ganz praktisch sein könnte sich ein wenig c++ an zu schauen. Und da es VC++ 2008 express derzeit für Lau gibt, habe ich mir das mal besorgt.

An sich scheint die Sache ganz übersichtlich und die vielen Tutorials helfen sehr. Allerdings scheitere ich derzeit an einem Trivial Problem:

Code: Alles auswählen

#include <iostream>
#include "testklasse.cpp"
using namespace std;

class testklasse
{

	private:
		int value;

	public:
		void setValue(int newvalue)
		{value = newvalue;}
		void doValue()
		{value = 345;}
		int getValue()
		{return value;}
	
};

   void main()
{
	testklasse testen;

	testen.setValue(12);
	testen.doValue();
	cout<<testen.getValue();

	int blub;
	cin>>blub;
};
Dieser Code funktioniert wunderbar.
Sobald ich die Klasse allerdings in die (noch leere) testklasse.cpp kopiere, interessiert das c++ recht wenig.
Jegliche Änderungen werden trotz Speichern und ähnlichem ignoriert. Er tut einfach so als hätte ich nie den Code verändert. Debuggt man meint er strikt, der Code hätte sich doch tatsächlich verändert. Ist ja ein Ding. Und deswegen schmeisst er einen einfach wieder raus aus dem Debuggen.

So macht das irgendwie keinen Spass...
pb 4.51
Benutzeravatar
milan1612
Beiträge: 810
Registriert: 15.04.2007 17:58

Beitrag von milan1612 »

*.cpp Dateien inkludiert man nicht, #include ist für *.h (für Header) Dateien.
Das verwirrt viele Compiler (wie anscheinend auch bei deinem der Fall) und ist
außerdem schlechter Stil.

EDIT:
void main() ist falsch, es heißt int main().

EDIT2:
Ich habs dir mal richtig aufgeteilt. Gewöhn dir das am Besten gleich von Anfang an richtig an.

testklasse.h

Code: Alles auswählen

#pragma once //damit die Datei nur einmal inkludiert wird

class testklasse
{
   private:
      int value;

   public:
      void setValue(int newvalue);
      void doValue();
      int getValue();
};
testklasse.cpp

Code: Alles auswählen

#include "testklasse.h"

void testklasse::setValue(int newvalue)
{
  value = newvalue;
}

void testklasse::doValue()
{
  value = 345;
}

int testklasse::getValue()
{
  return value;
}
main.cpp

Code: Alles auswählen

#include <iostream>
#include "testklasse.h"
using namespace std;

int main()
{
   testklasse testen;

   testen.setValue(12);
   testen.doValue();
   cout<<testen.getValue();

   int blub;
   cin>>blub;
};
EDIT3:
Vielleicht noch eine kurze Erklärung...

Eine *.cpp Datei ist eine vollständig unabhängige Codeunit, um deren Code in
anderen *.cpp Dateien verwenden zu können, verwendet man eine Headerdatei.

Diese Headerdatei fungiert praktisch als Schnittstelle und enthält keinen Code
sondern nur Definitionen. Der eigentliche Code deiner Klasse wird dann in eine
eigene *.cpp Datei ausgelagert.
Bin nur noch sehr selten hier, bitte nur noch per PN kontaktieren
Benutzeravatar
gnasen
Beiträge: 578
Registriert: 01.08.2007 14:28
Computerausstattung: PB 4.60

Beitrag von gnasen »

vielen Dank für die Ausführungen, werde ich gleich mal ein wenig testen.
pb 4.51
Benutzeravatar
gnasen
Beiträge: 578
Registriert: 01.08.2007 14:28
Computerausstattung: PB 4.60

Beitrag von gnasen »

Tatsache, jetzt funktioniert es wunderbar.
Seltsam finde ich es dennoch, der hätte mit dem vorherigen Mischmasch auch klar kommen müssen.
Es war ja nicht verkehrt, nur anders angeordnet.
Wenn so etwas nicht richtig ist, sollte wenigstens eine vernünftige Fehlermeldung dabei rumkommen.
Das ist das was mich an c++ noch am meisten stört, diese nicht immer ganz eindeutigen Fehlermeldungen.

Zuletzt, was genau hat es mit dem Namespace auf sich?
Verstehe ich das richtig, dass wenn ich nicht immer std::cout schreiben möchte, einfach den Namespace auf "std" setze und das quasi immer ergänzt wird?
Oder hat das noch tiefgreifendere Funktionen?
pb 4.51
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag von DarkDragon »

gnasen hat geschrieben:Zuletzt, was genau hat es mit dem Namespace auf sich?
Verstehe ich das richtig, dass wenn ich nicht immer std::cout schreiben möchte, einfach den Namespace auf "std" setze und das quasi immer ergänzt wird?
Oder hat das noch tiefgreifendere Funktionen?
Nein, du setzt den Namespace nicht auf std, sondern du sagst dem Compiler nur, dass du das verwendest, sonst könntest du ja nicht mehrere Namespaces verwenden:

Code: Alles auswählen

namespace A { const int X = 3; }
namespace B { const int Y = 5; }

...

using namespace A;
using namespace B;

...

std::cout << X << std::endl;
std::cout << Y << std::endl;
Also im Prinzip hast du es denke ich verstanden, nur das "setzen" stimmt nicht ganz. Und wenn du selbst namespaces anlegst, dann merkst du schnell wie das funktioniert. Denn auch sowas geht:

testA.h

Code: Alles auswählen

namespace blubb {
  ...
  namespace foo {
    ...
  }
}
testB.h

Code: Alles auswählen

namespace blubb {
  ...
  namespace bar {
    ...
  }
}
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
gnasen
Beiträge: 578
Registriert: 01.08.2007 14:28
Computerausstattung: PB 4.60

Beitrag von gnasen »

und ein weiteres Danke.
Ich muss sagen die Dinger würde ich mir sogar in PB wünschen.
Zurzeit kapsel ich in Includes die globalen Variablen (falls mal welche anfallen) in komisch bennanten Namen ab (_inc_ davor oder ähnliches).
So ein Namespace wäre da gar nicht so verkehrt.
pb 4.51
Antworten