Forum: PC-Programmierung Problem friend Klassen


von gerbej s. (sgerbej)


Lesenswert?

Hallo zusammen!

ich habe folgende Problem:

ich haben drei  Variablen,die ich über die Konsol eingeben und  soll die 
in zwei Klassen verwenden; undzwar soll in eine Klasse eine Methode die 
drei Variabele multipliziert  und in die zweite Klasse eine Methode , 
die drei Variable addiert.
Daher habe ich versucht über Friend-Klassen es zulösen .

hier  ist mein code

Project.h
1
project.h
2
class B;
3
class A
4
{
5
  public:
6
  
7
    int multi();
8
    void setabc();
9
    friend class B;
10
11
  private:
12
 
13
    int a;
14
    int b;
15
    int c;
16
};
17
         
18
class B{
19
  
20
 public:
21
22
  int add();
23
  };
project.h
1
void A::setabc(){
2
3
  cout << "a eingeben:"<<endl;
4
  cin>> a;
5
  cout<<" b eingeben:"<<endl;
6
  cin>> b;
7
  cout<<" c eingeben:"<<endl;
8
  cin>> b;
9
}
10
11
int B::add(){
12
  
13
  int sum;
14
  A k;
15
  sum =k.a+k.b+k.c;
16
  // cout<<"sum="<<k.a<<"+"<<k.b<<"+"<<k.c<<"="<<sum<<endl;
17
  return sum;
18
}
19
20
int A::multi(){
21
  
22
  int mult;
23
  mult = a* b*c;
24
  //cout<<"multip ="<<a<<"*"<<b<<"*"<<"c"<<"="<<mult<<endl;
25
  return mult;
26
}
main.cpp
1
int main()
2
{  
3
  A Multdata;
4
  B Sumdata;
5
6
  Multdata.setabc();
7
8
  int mult = Multdata.multi();
9
  cout << "multi="<<mult<<endl;
10
   int sum = Sumdata.add();
11
   cout << "sum="<<sum<<endl;
12
  return 0 ; 
13
}

hier ist das Programm beim Ausführung
1
a eingeben:
2
1
3
 b eingeben:
4
2
5
 c eingeben:
6
3
7
multi=645654736
8
sum=-436806736

kann mir Jemand da weiterhelfen.
bin für jede Hilfe sehr Dankbar

Grub
Seb

von Karl H. (kbuchegg)


Lesenswert?

gerbej seb schrieb:
> Hallo zusammen!
>
> ich habe folgende Problem:
>
> ich haben drei  Variablen,die ich über die Konsol eingeben und  soll die
> in zwei Klassen verwenden; undzwar soll in eine Klasse eine Methode die
> drei Variabele multipliziert  und in die zweite Klasse eine Methode ,
> die drei Variable addiert.
> Daher habe ich versucht über Friend-Klassen es zulösen .

Nope.
Das ist nicht der Einsatzzwecke von friend.
Lose es bitte anders.

freind-Klassen benutzt man dann, wenn man eine enge thematische Kopplung 
2-er Klassen hat. Zb ein Container und Iteratoren auf diesen Container. 
Ein Iterator ist ohne Container sinnlos, gehört als ganz eng zum 
Container. Deshalb kann man ihn friend machen, damit er auf die 
Internals der Containerklasse Zugriff hat.

Ist wie im richtigen Leben: Nur deinen engsten, allerbesten, 
vertrauenswürdigsten Freunden gestattest du Zutritt in dein 
Schlafzimmer. Niemandem sonst.


In deinem Fall führt der korrekte Lösungsweg über die Fragestellung: Ist 
denn eigentlichg eine Klasse, die für das Multiplizeren 3-er Werte 
zuständig ist auch dafür zuständig wo die Werte herkommen? Und die 
Antwort darauf lautet: Nein, sie ist es nicht. Das ist nicht ihr Bier.

Solange du keine wirklich enge Kopplung zwischen 2 Klassen benötigst, 
ist eine friend Klasse meistens der falsche Weg und ein ziemlich 
sicheres Indiz dafür, dass deine Klassenaufbau bzw. die 
Aufgabenverteilung deiner Klassen nicht stimmt. Freundschaft ist etwas, 
was eine Klasse niemals leichtfertig zugesteht und dann auch nur dann, 
wenn es gar nicht anders geht, bzw. wenn man dem Partner, und nur diesem 
Partner Zugriff auf Member Variablen geben will, man also die Member 
nicht über eine public Schnittstelle zugänglich machen will.

Lies deine 3 Werte in main ein und übergib sie dem jeweiligen Objekt 
beim Aufruf der jeweiligen Funktion - dazu brauchst du keine friend 
Klassen.


Und so
1
int B::add(){
2
  
3
  int sum;
4
  A k;
5
  sum =k.a+k.b+k.c;
6
  // cout<<"sum="<<k.a<<"+"<<k.b<<"+"<<k.c<<"="<<sum<<endl;
7
  return sum;
8
}

geht das sowieso nicht. Denn das A Objekt in dieser Funktion ist nicht 
dasselbe Objekt, das hier
1
int main()
2
{  
3
  A Multdata;
4
5
 ...

erzeugt wurde. Die beiden Objekte sind vom gleichen Datentyp, sind aber 
nicht dasselbe Objekt.
Du erwartest ja auch nicht, dass zwischen einem
1
void foo()
2
{
3
  int u;
4
5
  ...
6
}

und
1
int main()
2
{
3
  int  Multu;
4
5
  ...
irgendwie magisch eine Verbindung besteht. Das sind 2 Variablen, die vom 
gleichen Datentyp, nämlich int sind. Und bei dir sind es eben 2 Objekte, 
die auch vom gleichen Datentyp, nänmlich class A, sind.

von Martin (Gast)


Lesenswert?

Und immer schön merken:

    Your friends are not your child's friends.
    Your child's friends are not your friends.
    Only friends can touch your private parts.

von gerbej s. (sgerbej)


Lesenswert?

Danke sehr Karl für  deine schnelle Antwort.

was ist denn der Beste Weg  auf drei Werte  von verschieden 
Klassenmethoden zugreiffen, globale möchte ich sie nicht deklarieren

von Karl H. (kbuchegg)


Lesenswert?

gerbej seb schrieb:
> Danke sehr Karl für  deine schnelle Antwort.
>
> was ist denn der Beste Weg  auf drei Werte  von verschieden
> Klassenmethoden zugreiffen, globale möchte ich sie nicht deklarieren

Warum nicht.

3 Variablen in main()

Beim Aufruf von mult() gibst du die Werte mit. Beim Aufruf von add() 
gibst du die Werte mit.

Man muss nicht alles kompliziert machen.

von gerbej s. (sgerbej)


Lesenswert?

nein das  möchte  ich  nicht gibt es keine andere alternative , die wie 
ich versuch.
das ist nur  ein beispiel   von  meinem Code.

mein Problem ist eigentlich ist das  ich wie  dies Beispiel drei werte 
in mehrere clasen verwenden soll u

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.