Zwei Klassen in einer Header Datei

amine89

Mitglied
hallo Leute !
ich bin anfänger bei c++ und habe gerade ein Problem mit einer Aufgabe bekommen und zwar :
ich habe ein Header datei für eine Komplexe Zahl erstellt , und dies auch implementiert , hat auch funktioniert ....
nun muss ich eine Polar Klasse definieren , die von Klasse Komplex erbt ...
meine Frage ist ! muss ich dann die Polar klasse in einer eigenen Header datei definieren oder in der komplex.h mit schreiben ?



ich bin sehr dankbar im voraus !

Amine
 
Hi und Willkommen bei tutorials.de,

beides ist möglich.
Weil es dem Lehrer vermutlich besser gefallen wird: mach eine eigene Datei.
Und in der Polar.h inkludierst du die Komplex.h, damit das Erben auch ohne Compilerfehler geht.
 
Hi sheel !

danke schön erst mal für die Antwort :)

ich habe einfach in der datei komplex.h die klasse polar weiter geschrieben , und würde gerne so weiter machen. wenn ich fertig bin dann versuche es anders zu machen .

ich habe leider jetzt 2 andere probleme ;

*private member obwohl ich set Funktion benutzt habe .
* abs() wurde nicht deklariert in SuperKLasse.
mein program sieht so aus :


C++:
\\Complex2.h


#ifndef _COMPLEX_H
#define _COMPLEX_H
#include <iostream>

using namespace std;

class Complex {
	
  private  :   double Real;
	           double Imaginaerteil;
	  
   public :
	  
	  Complex();
	  Complex(double , double );
	 
	  void printf();       
	  int getSign(double , double );     
 
    	 void sub (Complex *);
         void add (Complex*);
     	 void mul (Complex* );
     	 void div (Complex* );
         void Cop(Complex*C);
        void setReal(double r);
        void setImaginaerteil(double i);
     	 void complexConjugate();
	
		  
		  };
     	 
 class Polar : Complex{
 	
 	private: 
 	 double r;
 	
    public :
	  Polar(Complex *c);
	  
	   double abs();
 };    	 
	      
	 #endif
	 
\\Complex2.cpp
#include"Complex2.h"


 Complex::Complex(){
	     	double Real =0;
	     	double Imaginaerteil=0;}

	
 Complex::Complex(double Real, double Imaginaerteil){
		        
		        this->Real=Real;
	        	this->Imaginaerteil= Imaginaerteil;}

int Complex::getSign(double re, double img){
		
	    	if ( img > 0)    return 1 ;
	        else             return -1;}

void Complex::printf(){
		
	   	int Sign = getSign(Real, Imaginaerteil);
		
	    	if ( Sign==1){
	              cout<<Real<<" + "<< Imaginaerteil<< "J\n"<<endl;	
		          cout<<" Der Imaginaerteil ist positiv\n"<<endl;}
		
	        else{
				  cout<<Real<<"  "<< Imaginaerteil<< "J\n"<<endl;
	    	      cout<<" Der Imaginaerteil ist negativ\n"<<endl;
                  }}
	
	 
void Complex::sub (Complex *z){
	  Real = Real- z->Real;
	  Imaginaerteil = Imaginaerteil - z->Imaginaerteil;}
	  
void Complex::add (Complex *z){
	  Real = Real+ z->Real;
	  Imaginaerteil = Imaginaerteil + z->Imaginaerteil; }        	
	  
	  
void Complex::Cop(Complex*C){
	  	this->Real = C->Real;
	  	this->Imaginaerteil= C->Imaginaerteil;}

void Complex::mul (Complex *m){
	   double tmp;
	   tmp=Real;		
	   Real = Real* m->Real - Imaginaerteil * m-> Imaginaerteil;
	   Imaginaerteil =tmp* m->Imaginaerteil +  Imaginaerteil * m->Real;} 
		
 void Complex::div(Complex*m)	{
    	double nenner, hilf;
    	hilf = Real;
    	nenner = m->Real* m->Real + m->Imaginaerteil* m->Imaginaerteil;
    	Real =( Real*m->Real + Imaginaerteil* m->Imaginaerteil)/nenner ;
    	Imaginaerteil = ( hilf*m->Imaginaerteil -Imaginaerteil * m->Real)/nenner;}	  
    	
void  Complex ::setReal(double r){
	
  Real=r;
 };
 
void Complex ::setImaginaerteil(double i){
 	
  Imaginaerteil=i ;
 };
		
void Complex::complexConjugate(){
    	Real = Real;
	    Imaginaerteil = - Imaginaerteil;	
	}
	
	
 Polar::Polar(Complex *c):Complex(){
 	
	            
	          double r=0;
	          double phi=0;
			 
};	

double Polar::abs(){

	
	return sqrt((Real*Real)+ (Imaginaerteil*Imaginaerteil));
}

                                  
\\TestKomplex2.cpp

#include<cmath>
#include <cstdlib>
#include <iostream>
#include "Complex2.cpp"


using namespace std;

int main(){
	

	Complex * z1 = new Complex(1,1);
	Complex * z2 = new Complex(1,1);
	Complex * Substraktion = new Complex();
	Complex * Summe = new Complex();
    Complex * Multiplikation = new Complex();
	Complex * Division = new Complex();
    Complex * k=new Complex();
    
    
 	cout << "Erste Zahl : " ;
	z1->printf();

	
    cout << "Zweite Zahl: " ;
	z2->printf();


	*Substraktion=*z2;
	Substraktion ->sub(z1);
	cout<<"Die  Substraktion gibt : ";
	Substraktion->printf();
 
 
	*Summe =*z2;
    Summe -> add(z1);
    cout<<"Die  Summe  gibt : ";
	Summe->printf();
   
   
    
    *Multiplikation =*z2;
    Multiplikation -> mul(z1);
    cout<<"Die  Multiplikation  gibt : ";
	Multiplikation->printf();
	
	*Division = *z2;
	Division->div(z1);
	cout<< "Die  Division gibt :";
	Division->printf();
	
	
	cout<<"Eine kopie von der Zahl Z1 ist ";
	k->Cop(z1);
	k->printf();
	
	cout<< "Die konjugierte Zahl fuer z1 lautet:";
	z1->complexConjugate();
	z1->printf();
	
	cout<< "Die konjugierte Zahl fuer z2 lautet:";
	z2->complexConjugate();
	z2->printf();
	
	z1->abs();
	cout<<"betrag r ist "<<z1->abs()<<endl;
	
	
	
	system("PAUSE");
	return 0;}
 
Zuletzt bearbeitet von einem Moderator:
Den Code bitte immer mit [cpp ][ /cpp] einbinden, das macht ihn lesbarer.
Du musst bei Vererbung public nach dem Doppelpunkt schreiben:

C++:
class Derived : public Base
{
};

Wenn du nichts dazuschreibst bedeutet das automatisch private-Vererbung und dann ist deine gesamte Basisklasse privat für die erbende Klasse. public-Vererbung bedeutet, dass was public in der Basisklasse ist, ist auch in der erbenden Klasse public, dasselbe mit private.

Lg
 
Hallo amine89

Mehrere Sachen:
C++:
Für Code haben wir nette Boxen

Macht man mit [code=cpp]Für Code haben wir nette Boxen[/code]

C++:
using namespace std;

Hat in einem Header (und meiner Meinung nach allgemein im globalen Scope) nichts zu suchen.
C++:
Complex * z1 = new Complex(1,1);
Complex * z2 = new Complex(1,1);
Complex * Substraktion = new Complex();
Complex * Summe = new Complex();
Complex * Multiplikation = new Complex();
Complex * Division = new Complex();
Complex * k=new Complex();

Warum alles dynamisch allozierte Objekte? Aufm Stack angelegte reichen mehr als aus für die Polymorphie kannst du auch mit Referenzen arbeiten, kein Grund Zeiger zu verwenden!

Fehler mit abs:
C++:
Complex* z1 = new Complex(1, 1);
z1->abs();

Die Klasse Complex hat keine abs-Methode, nur die Klasse Polar.

Viele Grüsse
Cromon
 
ich hab public dazu geschrieben und der compiler zeigt mir die selben fehlern !


wie kann das mit
C++:
...
einbinden ?

danke
gruß
 
Als Ergänzung zu meinen obigen Punkten:
Die erbende Klasse kann nicht auf Member die in der Basis private sind zugreifen. Ausschliesslich auf die, die public und protected sind.
 
Danke Leute !
ich habe alle Probleme gelöst ,
in dem ich protected statt private benutzt und einen neuen objekt Polar erzeugt habe

C++:
Polar * x= new Polar(z1);
nun habe ich ein kleines problem :

ich bekomme als ergebnis für meinen betrag r den wert : 1,5271e+ 215 !!

wenn ich das aufrufe
C++:
 double betrag = x->abs();
	
	 cout<<"betrag r ist "<<betrag<<endl;

grüße
 
Du initialisierst gewisse Variabeln nicht:
C++:
 Complex::Complex() {
            double Real =0;
            double Imaginaerteil=0;
}

Das sind lokale Variabeln nicht die der Klasse.

Ausserdem frage ich doch nochmals:
Aus welchem Grund verwendest du überall unnötigerweise Zeiger und auf dem Heap allozierte Objekte die du dann in ein Memoryleak laufen lässt?
 
Hi Cromon ! ich habe das mit zeiger geändert !

C++:
Complex  z1 =  Complex(2,3);
	Complex  z2 =  Complex(5,6);
	Complex  Substraktion =  Complex();
	Complex  Summe =  Complex();
        Complex  Multiplikation =  Complex();
	Complex  Division =  Complex();
        Complex  k = Complex();
    
          Polar x= Polar(&z1);


jetzt bekomme ich in der linie :

C++:
 double betrag = x.abs();
	
	 cout<<"betrag r ist "<<betrag<<endl;

den wert inf als rückgabe !!

kann mir bitte jmd sagen , wo mache ich den fehler ****

lg
 
Zurück