Nachrichtenaustauschprinzip - C++


Programmierung HTML, CSS, PHP, JAVA, XML etc.

Antwort
 
Themen-Optionen
Alt 07.07.2008, 16:17   #1 (permalink)
aKe
Nachrichtenaustauschprinzip - C++

Tag zusammen,


habe da mal ne Frage, trotz C++ Kurs an der Uni und einem gewissen Talent was die Sprache betrifft habe ich doch irgendwie eine kleine Denkblokade.

Es geht ums Objektorientierte Programmieren.

In Klasse A erstelle ich eine Variable, die in einer Funktion einen Wert zugewiesen bekommt. Genau diesen Wert möchte ich jetzt einer Variable in Klasse B zuweisen, weil dort eine Funktion mit diesem Wert weiterarbeiten soll.

Mir ist klar, dass ich dafür eine Variable in Klasse B erstellen und diese mittels Funktion zu der Variable in Klasse A referenzieren muss. Nur wie ? Keine meiner Ansätze funktioniert, Google und ein Lehrbuch helfen mir da auch nicht weiter und mein Prof. ist bei aller Genialität manchmal ein etwas chaotischer Didakt

Weiss jemand die genaue Syntax / Codierung ?

Gruß
__________________
aKe ist offline   Mit Zitat antworten
Alt 07.07.2008, 21:13   #2 (permalink)
AW: Nachrichtenaustauschprinzip - C++

Ich stelle fest bei C++ ganz schön aus der Übung gekommen zu sein.

Von wo soll denn das Übergeben des Wertes ausgelöst werden? von main(), beim Setzen des Wertes in Klasse A oder durch einen Aufruf in Klasse B? Wolltest Du explizite Klassennamen, Zeiger oder Referenzen nemhen? Arbeitest Du mit Streams? Es gibt dafür viele Wege, welcher der Richtige oder Beste ist, sagt der Sinn der Anwendung.

Mal eine spontane Möglichkeit wäre folgendes:
Code:
#include <iostream>
using namespace std;

/* Definition der Klasse TheClass und aller Elemente */
class TheClass {
  public:
  TheClass();                   /*Konstruktor*/
  ~TheClass();                  /*Destruktor*/
  
  int GetTheVar() { return theVar; }
  void SetTheVar(int tmpVar) { theVar = tmpVar; }
  
  private:
  int theVar;
}

/* Funktionen in TheClass */
TheClass::TheClass(){
  theVar = 0;
}
TheClass::~TheClass() {}

/*Programm*/
int main(){
  TheClass * pClassA = new TheClass;  /*Klasse A erzeugen, mit pClassA als Zeiger*/
  TheClass * pClassB = new TheClass;  /*Klasse B erzeugen, mit pClassB als Zeiger*/
  
  pClassA->SetTheVar(12);                     /*Wert 12 in Klasse A schreiben*/
  pClassB->SetTheVar(pClassA->GetTheVar());   /*In Klasse B den Wert von Klasse A setzen*/
  
}
Ich hab das jetzt nicht getestet, sondern nur eben runtergeschrieben. Geht das in die Richtung wie Du es meintest?
__________________
Man reiche mir mein LART!
Kein Support bei IT-Fragen via ICQ, Skype, PN oder Email!
(Stammuser ausgenommen)
Xaicon ist offline   Mit Zitat antworten
Alt 07.07.2008, 21:43   #3 (permalink)
aKe
AW: Nachrichtenaustauschprinzip - C++

ahoi xai,

erstma schönen Dank. Sieht in die nach richtiger Richtung aus. Es geht explizit um ein einfaches untereinander Austauschen.

Das Ganze war eine MFC-Anwendung, also leider in Visual Studio (eig. n gutes Tool, nur halt fürchterlich verkorkst was manche Sachen betrifft. Haben Klassenerzeugen auch nur via VS gelernt. Was uns zwar zu kleinen Göttern im Umgang mit VS macht, die C++ Prinzipien allerdings ein bisschen übergeht, da einem das Programm, gerade was MFC betrifft eine Menge vorwegnimmt, aber das am Rande)

Ich hatte als Studienleistung entschieden ein Kniffel zu programmieren und zusätzlich das Ganze mit Transferinhalt zu machen, sprich gescheiter Objektorientierung.
So jetzt hatte ich also folgende Klassen:

CWürfel;
CSpiellogik;
CKniffeldlg;

jetzt gab es Beispielsweise die Variable int iWuerfelergebnis.

Code:
// CWuerfel::Wuerfelergebnis()
{

int i Wuerfelergebnis;

// der Code, wie das Würfelergebnis ermittelt wurde ist mal egal.

iWuerfelergebnis = FullHouse = 25;
}

// Jetzt braucht die Spiellogik das Ergebnis also iWuerfelergebnis,
// damit folgendes gemacht werden kann:

CSpiellogik::Pruefen()
{
if(iWuerfelergebnis == 25)
bFullHouse = true;
}

// Und jetzt wird das Ergebnis an den Dialog geschickt, wo das Ergebnis
// durch Buttonklick in das entsprechende Feld eingetragen werden soll

CKniffeldlg::OnBnClickedButtonFullHouse()
{

CSpiellogik.Pruefen();
if(bFullHouse)
m_edit_fullhouse = 25;                                // EditControl Valuevariable
m_button_fullhouse.WindowEnabled(false);  //Editcontrol Steuervariable

}
wie man sieht, da müssen eine ganze Menge Variablen hin und hergeschickt werden. Fraglos ist es so, gerade für ein Kniffel umständlicher als notwendig, aber es geht ja um den Lerneffekt nicht wahr
Der Code ist stark abstrahiert, aber ich denke, das Prinzip ist klar.

Lieben Gruß
__________________
aKe ist offline   Mit Zitat antworten
Alt 08.07.2008, 16:42   #4 (permalink)
Lächeln AW: Nachrichtenaustauschprinzip - C++

Ich bin in C++ nicht so fit. Ist es denn möglich dass du in einer Klasse ein Objekt einer anderen Klasse erstellst und damit arbeitest? Also in Pseudocode sowas wie:

Code:
CSpiellogik::Pruefen()
{
  CWuerfel wuerfel = new CWuerfel;
  int iWuerfelergebnis = wuerfel.Wuerfelergebnis();
  if(iWuerfelergebnis == 25)
    bFullHouse = true;
}
__________________
life is great, you just have to look at it from the right perspective
Alp.traum ist offline   Mit Zitat antworten
Alt 08.07.2008, 17:35   #5 (permalink)
aKe
AW: Nachrichtenaustauschprinzip - C++

Zitat:
Zitat von Alp.traum Beitrag anzeigen
Code:
CSpiellogik::Pruefen()
{
  int iWuerfelergebnis = wuerfel.Wuerfelergebnis();
}
genau dieses zeilchen funktioniert NICHT ... da spuckt der mir nen operatorfehler aus. war schon stolz bei knapp 1000 zeilen code nur einen fehler zu haben, aber genau dieser fehler wirft die gesamte objektorientierung über den haufen.

hatte da mal folgende funktion

Code:
CSpiellogik::Logik_nach_Dialog()
{

iWuerfelergebnis = m_wuerfel.iWuerfelergebnis;  // m_wuerfel ist die membervariable 
bFullHouse = m_wuerfel.bFullHouse;                    // für die Klasse CWuerfel

usw.

}
diese Funktion wurde dann einfach jedes Mal vor einer Anweisung mit Klassenübergreifenden Variablen ausgeführt und dasselbe danach in die andere Richtung, sofern benötigt. Hat wie gesagt, nicht geklappt. Habe den Fehler, den VS ausgespuckt hat dann mal recherchiert und bin auf die Aussage gestossen, dass Gleichsetzen aus div. Gründen nicht funktioniert und man mit Pointern und Referenzen arbeiten muss.

also etwas in diese Richtung:

Code:
int iWuerfelergebnis, *piWuerfelergebnis;

piWuerfelergebnis = &m_wuerfel.iWuerfelergebnis;
hat aber auch nit gescheit funktioniert. Hach ja. Andere Lösungen entziehen sich da noch meiner Kenntnis. Ich glaube ich geh mal den Prof. nochmal dicke nerven und schreib die Lösung dann hier rein
__________________
aKe ist offline   Mit Zitat antworten
Alt 08.07.2008, 17:41   #6 (permalink)
AW: Nachrichtenaustauschprinzip - C++

Wie genau sieht denn die Fehlermeldung aus?
__________________
life is great, you just have to look at it from the right perspective
Alp.traum ist offline   Mit Zitat antworten
Alt 08.07.2008, 23:03   #7 (permalink)
AW: Nachrichtenaustauschprinzip - C++

Ich habe gerade keine meiner alten C++ Codes und kein Buch dabei, daher kann ich leider nicht nachkucken. Aber wenn ich mich recht entsinne wäre die Lösung in der Klasse Würfel das Ergebnis in eine konstante Referenz zu schreiben:
const int& referenz=ergbnis;

Wenn ich wieder zuhause bin kann ich nochmal nachkucken wie das genau war. DBP versaut jedes Gefühl für anständige Programmiersprachen.
__________________
Man reiche mir mein LART!
Kein Support bei IT-Fragen via ICQ, Skype, PN oder Email!
(Stammuser ausgenommen)
Xaicon ist offline   Mit Zitat antworten
Alt 09.07.2008, 19:07   #8 (permalink)
aKe
AW: Nachrichtenaustauschprinzip - C++

Ich war heute nochmal bei meinem Prof und hab den ein wenig ausgefragt. Ende vom Lied war dann, dass man das Ganze mittels eines "this" Befehls und Referenzen zustande bekommt (keine Ahnung wie das im Code aussieht. Kannte den Befehl bislang noch nicht.) Oder folgendes, und das ist ganz bzw fast wie Xai direkt am Anfang geschrieben hat:

Klasse A generiert den Wert für Variable A.
Klasse B möchte den Wert haben und damit weiterarbeiten.

ergo:

Code:
Class A{
int var, *pvar;

pvar = var;

var = 25;
}

Class B{

int var2;

var2 ->m_A.pvar;
}
keine Ahnung ob das so jetzt auch funktionieren würde. Fakt ist, dass es so in der Richtung funktioniert. Der "->" ist ein Operator der extra dafür da ist, auf Pointerreferenzen anderer Klassen zuzugreifen. Mir fällt da ein einfaches Beispiel für die Funktionsweise ein.

Code:
CPen pen, pen2, pen3, *ppen;

pen = Create.Pen(PS_SOLID, 4, RGB(255,255,255));
pen2 = Create.Pen(PS_SOLID, 4, RGB(0,0,0));

ppen = pdc->Select.Object(&pen);

pdc->LineTo(bla bla);                          //Der Stift malt weiss

ppen = pdc ->Select.Object(&pen2);   

pdc ->LineTo(bla bla);                          //Der Stift malt schwarz
__________________
aKe ist offline   Mit Zitat antworten
Alt 09.07.2008, 20:10   #9 (permalink)
AW: Nachrichtenaustauschprinzip - C++

Na dann erzähl mal ob das so funktioniert. Ist ja ganz schön umständlich.
__________________
life is great, you just have to look at it from the right perspective
Alp.traum ist offline   Mit Zitat antworten
Alt 09.07.2008, 20:23   #10 (permalink)
aKe
AW: Nachrichtenaustauschprinzip - C++

Zitat:
Zitat von Alp.traum Beitrag anzeigen
Na dann erzähl mal ob das so funktioniert. Ist ja ganz schön umständlich.
für kleine Projekte zweifellos. Bedenkt man Projekte mit 500 Klassen und mehr, find ich das eigentlich ganz schön sexy.
__________________
aKe ist offline   Mit Zitat antworten
Alt 09.07.2008, 20:39   #11 (permalink)
AW: Nachrichtenaustauschprinzip - C++

Zitat:
Zitat von aKe Beitrag anzeigen
für kleine Projekte zweifellos. Bedenkt man Projekte mit 500 Klassen und mehr, find ich das eigentlich ganz schön sexy.
Ok, ich dachte es grad umgekehrt, weil es ja dann erst richtig darauf ankommt, dass man gescheite Interfaces basteln kann. Aber wahrscheinlich geht das auch elegant, ich hab einfach zuwenig Plan von C++.
__________________
life is great, you just have to look at it from the right perspective
Alp.traum ist offline   Mit Zitat antworten

Alt 09.07.2008, 22:47   #12 (permalink)
aKe
AW: Nachrichtenaustauschprinzip - C++

Zitat:
Zitat von Alp.traum Beitrag anzeigen
Ok, ich dachte es grad umgekehrt, weil es ja dann erst richtig darauf ankommt, dass man gescheite Interfaces basteln kann. Aber wahrscheinlich geht das auch elegant, ich hab einfach zuwenig Plan von C++.

Hat jetzt weniger mit C++ zu tun, als mit der Objektorientierung an sich. Angenommen du hast ein großes Projekt, welches 500 Klassen besitzt ist Objektorientierung in erster Linie einfach nur übersichtlich. Code, Funktionen, Werte und Variablen zu beispielsweise Fahrphysik wirste dann auch in der entsprechenden Klasse finden und bearbeiten können. Brauchst du einen dieser Werte auch woanders greifst du einfach auf diese Variable von der anderen Klasse aus zu. Und das mit einer Zeile Code. Finde ich nicht sonderlich umständlich
__________________
aKe ist offline   Mit Zitat antworten
Antwort

Stichworte Lesezeichen
c++, objektorientiert, programmierung

Themen-Optionen

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus
Gehe zu



Alle Zeitangaben in WEZ +1. Es ist jetzt 21:38 Uhr.
Powered by vBulletin® Copyright ©2000 - 2008, Jelsoft Enterprises Ltd. | SEO by vBSEO 3.2.0 ©2008, Crawlability, Inc.
Copyright ©2008, BoardPlanet.net | Style enhanced by digital-anger.de