C++ klassendefinition

hallo.

habe hier folgende klasse vor mir liegen:

class klasse
{

public:

klasse(AbstractXXXreceiver& xxxReceiver,
XXXMaster& master,
TaskType task,
EventMaskType event,
AlarmType alarm,
Cycle& nullCycle);

virtual ~klasse()
{}

void schedule();

void start();

void stop();

bool started();

void requestCycle(Cycle& cycle, uint8 pos=0);

uint8 interruptActiveCycle(Cycle& cycle, uint8 pos=0);

uint8 stopActiveCycle();

Cycle& getActiveCycle()
{
return *fActiveCycle;
}

bool addcycleListener(IcycleListener& listener);

void removecycleListener(IcycleListener& listener);

void setCycleType(uint8 cycleType);

uint8 getCycleType(void);

private:

struct State : private common::Uncopyable
{
virtual ~State(){}
virtual void schedule(klasse& ls){ assert(false); }
virtual void start(klasse& ls){ assert(false); };
virtual void stop(klasse& ls){ assert(false); };
virtual void requestCycle(Cycle& cycle, uint8 pos, klasse& ls){ assert(false); }
virtual uint8 interruptActiveCycle(Cycle& cycle, uint8 pos, klasse& ls){ assert(false); return 0; }
virtual uint8 stopActiveCycle(klasse& ls) {assert(false); return 0; }
};

struct Stopped: State
{
virtual ~Stopped(){}
virtual void start(klasse& ls);
};

struct Idle: State
{
virtual ~Idle(){}
virtual void schedule(klasse& ls);
virtual void stop(klasse& ls);
virtual void requestCycle(Cycle& cycle, uint8 pos, klasse& ls);
virtual uint8 interruptActiveCycle(Cycle& cycle, uint8 pos, klasse& ls);
virtual uint8 stopActiveCycle(klasse& ls){ return 0; }
};

struct Running: State
{
virtual ~Running(){}
virtual void schedule(klasse& ls);
virtual void stop(klasse& ls);
virtual void requestCycle(Cycle& cycle, uint8 pos, klasse& ls);
virtual uint8 interruptActiveCycle(Cycle& cycle, uint8 pos, klasse& ls);
virtual uint8 stopActiveCycle(klasse& ls);
};

struct Stopping: State
{
virtual ~Stopping(){}
virtual void schedule(klasse& ls);
virtual void stop(klasse& ls);
virtual void requestCycle(Cycle& cycle, uint8 pos, klasse& ls){}
virtual uint8 interruptActiveCycle(Cycle& cycle, uint8 pos, klasse& ls){ return 0; }
virtual uint8 stopActiveCycle(klasse& ls){ return 0; }
};

void changeState(State& state)
{
fpCurrentState = &state;
}

static Stopped fStopped;
static Idle fIdle;
static Running fRunning;
static Stopping fStopping;
State* fpCurrentState;

/* hier kommen noch einige funktionsdefinitionen und enums usw. */

}

frage:
was bedeutet das alles?

daß es public-funktionen gibt, die von außen sichtbar sind, ist klar.

daß mich die assert(false); raushauen, wenn ich auf eine private-funktion zugreifen will, ist auch klar.

daß common::Uncopyable die klasse Uncopyable im namespace common meint, ist auch klar - warum das gebraucht wird, weniger…?

wo ich im moment total aufm schlauch stehe, sind diese structs… was machen die? bzw. was kann ich damit machen?

und kann mir bitte jemand bestätigen, daß das für jemanden, der bisher nur C programmiert hat, ziemlich schwere kost ist?!

gruß

michael

Hallo

wo ich im moment total aufm schlauch stehe, sind diese
structs… was machen die? bzw. was kann ich damit machen?

C++ missbraucht hier die struct als Klasse, da in C++ struct und class meines Wissens gleich behandelt werden. Das bedeutet, dass eine Struktur ebenfalls Memberfunktionen/variablen haben kann.

struct State : private common::Uncopyable

Bedeutet, dass die struct (class) State von der class Uncopyable im Namespace common abgeleitet wird. Das bedeutet, dass sie alle Variablen und Funktionen von Uncopyable vererbt. Mehr dazu findest du unter dem Stichwort Vererbung oder Polymorphie in Google.

Mit virtuellen Funktionen hab ichs auch nicht so (bin hauptsächlich auch nur C Programmierer), aber ich glaube die werden verwendet, wenn Funktionen zwar deklariert aber nicht in der sogenannten Basisklasse, sondern erst in einer abgeleiteten Klasse definiert werden.

und kann mir bitte jemand bestätigen, daß das für jemanden,
der bisher nur C programmiert hat, ziemlich schwere kost ist?!

Kann ich definitiv bestätigen. Objektorientierte Programmierung und Vererbung sind ausgefeilte Konzepte, die für den, der damit umgehen kann, sicherlich was tolles sind, aber ich habe auch noch jedes Problem mit Strukturen und Funktionen hinbekommen =)

lg dixxi

Hallo Michael

frage:
was bedeutet das alles?

Dass du ein gutes Buch brauchst, wo das alles erklärt wird, z.B.
„C++ in 21 Tagen“.

daß mich die assert(false); raushauen,

Das assert() ist ein C-Funktion, die für die Laufzeit gedacht ist, falls dann Fehler auftreten. Sie erwartet einen logischen Ausdruck, der im Erfolgsfall „true“ ergibt.
Wenn Du dagegen „assert(false)“ schreibst, ist der natürlich immer „false“, das ist genauso, als würdest Du

if (1 
schreiben. Leuchtet das ein?



> wenn ich auf eine private-funktion zugreifen will, ist auch klar.


Nein: dann kriegst Du einen Compiler-Fehler, und das läuft erst gar nicht.



> daß common::Uncopyable die klasse Uncopyable im namespace common meint, :ist auch klar - warum das gebraucht wird, weniger...?


Um den globalen Bereich zu unterteilen: in einem anderen Namespace können dann Datentypen und Bezeichner mit gleichem Namen auftauchen, ohne eine Fehlermeldung.



> und kann mir bitte jemand bestätigen, daß das für jemanden, der bisher :nur C programmiert hat, ziemlich schwere kost ist?!


Das ist vor allem so, wenn man sich Code kopiert, der einem noch über die Hutschnur geht. Schreibe mal ein paar Minis, und freue Dich darüber, wie schön die laufen. Du kannst nicht alle C++-Optionen auf einmal lernen, immer nur kleine Portionen, hübsch der Reihe nach.

lG
Martin

hallo martin.

Dass du ein gutes Buch brauchst, wo das alles erklärt wird,
z.B.
„C++ in 21 Tagen“.

und das funktioniert?

daß mich die assert(false); raushauen,

Das assert() ist ein C-Funktion, die für die Laufzeit gedacht
ist, falls dann Fehler auftreten. Sie erwartet einen logischen
Ausdruck, der im Erfolgsfall „true“ ergibt.
Wenn Du dagegen „assert(false)“ schreibst, ist der natürlich
immer „false“, das ist genauso, als würdest Du

if (1
schreiben. Leuchtet das ein?

ja sicher. die assert-funktion ist hier ein makro auf eine funktion __ecu_assert, die im „false“-fall folgendes tut:

  • per printf eine fehlermeldung über RS232 ausgeben
  • SW-reset durchführen

wenn ich auf eine private-funktion zugreifen will, ist auch klar.

Nein: dann kriegst Du einen Compiler-Fehler, und das läuft
erst gar nicht.

ok… aber wofür sind dann die asserts in den private-funktionen gut? die würden doch bedeuten, daß ich bei jedem aufruf einer private-funktion (die ja nur assert(false) enthalten) durch o.g. reset laufe…?

Das ist vor allem so, wenn man sich Code kopiert, der einem
noch über die Hutschnur geht. Schreibe mal ein paar Minis, und
freue Dich darüber, wie schön die laufen. Du kannst nicht alle
C+±Optionen auf einmal lernen, immer nur kleine Portionen,
hübsch der Reihe nach.

meine rede. das problem ist, daß ich hier ein ziemlich großes sortwarepaket rumliegen hab, das ich (in c) erweitern muß. und bevor ich da drin rumpfusche, hätte ich halt gern halbwegs gewußt, was so abgeht.
daß das nicht von heut auf morgen gehen kann, ist klar.

danke & gruß

michael

hallo.

C++ missbraucht hier die struct als Klasse, da in C++ struct
und class meines Wissens gleich behandelt werden. Das
bedeutet, dass eine Struktur ebenfalls
Memberfunktionen/variablen haben kann.

hmmm… ok.
warum gibt es keinen konstruktor für die klasse/struktur „State“?

struct State : private common::Uncopyable

Bedeutet, dass die struct (class) State von der class
Uncopyable im Namespace common abgeleitet wird. Das bedeutet,
dass sie alle Variablen und Funktionen von Uncopyable vererbt.
Mehr dazu findest du unter dem Stichwort Vererbung oder
Polymorphie in Google.

ahaaa. so weit, so gut. die klasse Uncopyable sieht so aus:

class Uncopyable
{
public:
Uncopyable(){}
~Uncopyable(){}

private:
Uncopyable(const Uncopyable&amp:wink:;
Uncopyable& operator=(const Uncopyable&amp:wink:;
};

und ist das einzigste im namespace „common“.
(warum) macht es sinn, von dieser klasse zu erben? *???*

aber ich habe auch noch jedes Problem mit Strukturen und
Funktionen hinbekommen =)

sehe ich für die anwendungen, um die’s in meinem bereich geht, genauso. da wird mit kanonen auf spatzen geschossen… :-/

danke & gruß

michael

hallo Michael.

Dass du ein gutes Buch brauchst, wo das alles erklärt wird,
z.B.
„C++ in 21 Tagen“.

und das funktioniert?

Ich habe auch mit dem angefangen, hatte aber damals kein Internet, da war nix mit „fragen am Brett“. Ich habe mich aber trotzdem durchgebissen. Dickkopf muss man halt sein, :wink:
Dieses Buch ist für Einsteiger fast noch besser:
„Einstieg in C++“ von A. Willemer
das o.a. dann als zweites nehmen.

ja sicher. die assert-funktion ist hier ein makro auf eine
funktion __ecu_assert, die im „false“-fall folgendes tut:

Egal was sie tun, das literale „false“ ist m.E. ein Fehler (um mal Kraftausdrücke zu vermeiden). Aber vielleicht hat er irgendwas bezweckt damit, wie „diese nie aufrufen, sonst Fehlermeldung“.

ok… aber wofür sind dann die asserts in den
private-funktionen gut?

Müsstes Du den Entwickler fragen, der das fabriziert hat.

die würden doch bedeuten, daß ich bei
jedem aufruf einer private-funktion (die ja nur assert(false)
enthalten) durch o.g. reset laufe…?

Ja genau, aber s.o…

das problem ist, daß ich hier ein ziemlich großes
sortwarepaket rumliegen hab, das ich (in c) erweitern muß.

Stimmt das, dass Du das musst? Sagt das Dein Prof, oder wie?

und
bevor ich da drin rumpfusche, hätte ich halt gern halbwegs
gewußt, was so abgeht.

In dem einen Punkt sind wir uns ja einig, Bücher siehe oben.

lG
Martin B

hallo martin.

Dieses Buch ist für Einsteiger fast noch besser:
„Einstieg in C++“ von A. Willemer
das o.a. dann als zweites nehmen.

danke. werd ich mir mal anschauen.

die würden doch bedeuten, daß ich bei
jedem aufruf einer private-funktion (die ja nur assert(false)
enthalten) durch o.g. reset laufe…?

Ja genau, aber s.o…

es beruhigt mich ein bißchen, daß ich nicht der einzige bin, der die sinnhaftigkeit solcher codeschnipsel anzweifelt :smile:

das problem ist, daß ich hier ein ziemlich großes
sortwarepaket rumliegen hab, das ich (in c) erweitern muß.

Stimmt das, dass Du das musst? Sagt das Dein Prof, oder wie?

das erwartet mein chef. hab ich ja auch kein problem mit. ein paar c-funktionen, die was vernünftiges machen, sind relativ schnell implementiert. probleme macht mir eher die integration in einen sehr… naja… „kompakt“ dokumentierten code, der zum einen in c++ vorliegt und obendrein noch mit einigen offenbar unnötigen, zumindest aber verwirrenden konstrukten aufwartet.

gruß

michael

Ich bin auch von C nach C++ gekommen.

Mein Tip:

Frag Dich erst gar nicht was da alles abgeht.

Mit C-denken bin ich in C++ immer gut vorangekommen (was in Boards gepostet wird ist zu 80% falsch, und das Buch zu Deinem gerade vorliegenden Problem wirst Du erst in 5 Jahren gefunden haben), ebenso mit Assembler-Inlines. Und letztere finde ich immer noch am einfachsten und sichersten. Da wird nix von dritter Seite her herumgemurkst, Du hast die Kontrolle über den Stack und fertig.

Wenn Du wirklich wissen willst was abgeht mach einfach:

void function main()
{
__asm
{
call explainit


}
}

hallo.

C++ missbraucht hier die struct als Klasse, da in C++ struct
und class meines Wissens gleich behandelt werden. Das
bedeutet, dass eine Struktur ebenfalls
Memberfunktionen/variablen haben kann.

hmmm… ok.
warum gibt es keinen konstruktor für die klasse/struktur
„State“?

Ich kenne Die Antwort auch nicht, frage mich aber was Dich das kümmert. Zudem finde ich den Code absolut ungeeignet für Dich. Jemanden der Programmieren kann aber C++ nicht kennt verwirrt das doch nur. In solchen fällen hab ich einfach darauf hingewiesen, dass ich c++ nicht kenne und mein möglichstes mache, um das geforderte sicher zu implementieren, aber auch nicht mehr.

Quick and dirty und never touch a running system. Ist die Gefahr, dass du was veränderst was bisher gelaufen ist nicht grösser wenn Du erstmal weisst, was C++ seitig abgeht?

Hallo

wo ich im moment total aufm schlauch stehe, sind diese
structs… was machen die? bzw. was kann ich damit machen?

C++ missbraucht hier die struct als Klasse, da in C++ struct
und class meines Wissens gleich behandelt werden. Das
bedeutet, dass eine Struktur ebenfalls
Memberfunktionen/variablen haben kann.

Klassen und Strukturen unterscheiden sich in C++ nur in einem:

Strukturen sind standardmässig öffentlich
Klassen sind standardmässig privat