2016-09-22 2 views
0

Ich habe einen Klassenkomplex implementiert, der gut funktioniert.Header-Dateien, die Probleme verursachen

http://coliru.stacked-crooked.com/a/b6bff3884e8e2460

Jetzt versuche ich, eine Header-Datei zu erzeugen:

// 
// cplex.h 
// 
// 
// 
// 
// 


#ifndef cplex_h 
#define cplex_h 
#include <iostream> 



class complex 
{ 
    friend complex operator-(const complex& c); 
    friend complex operator +(const complex& c1 , const complex& c2); 
    friend complex operator +(const complex& c1 , const double& db); 
    friend complex operator +(const double& db , const complex& c1); 

    friend complex operator-(const complex& c1, const double& d); 
    friend complex operator-(const complex& c1 , const complex& c2); 
    friend complex operator-(const double& d ,const complex& c1); 
    friend complex operator *(const complex& c1 , const complex& c2); 
    friend complex operator *(const complex& lhs , const double& rhs); 
    friend complex operator *(const double& lhs , const complex& rhs); 
    friend complex operator /(const complex& lhs, const complex& rhs); 
    friend complex operator /(const complex& lhs, const double& rhs); 
    friend complex operator /(const double& lhs, const complex& rhs); 
    friend std::istream& operator>>(std::istream &is , complex &cp); 



private: 
    double re; 
    double im; 


public: 
    // constructors 

    complex(); // default constructor; 
    constexpr complex(const double real,const double img); 
    complex(double real); 
    complex(const complex& rhs); 


    // member functions; 
    double real() const; 
    double imag() const; 


    complex& operator = (const complex&); 
    complex& operator =(const double &); 

    complex& operator += (const complex&); 
    complex& operator +=(const double& other); 

    complex& operator -=(const double& db); 
    complex& operator -= (const complex&); 

    complex& operator *=(const double& db); 
    complex& operator *= (const complex&); 

    complex& operator /=(const double& db); 
    complex& operator /= (const complex&); 

}; 


std::ostream& operator <<(std::ostream &os ,const complex &cp); 





#endif /* cplex_h */ 

ok so schließlich möchte ich einige CxxTest tun, und ich rufe den Standardkonstruktor (complex x;) Ich erhalte eine Fehlermeldung :

duplicate symbol _main in: /var/folders/08/s_gsvpm577vgftp3tj2_47hr0000gn/T//ccbn1AAH.o complex.o ld: 1 duplicate symbol for architecture x86_64 collect2: error: ld returned 1 exit status

#include "cplex.h" 
#include <cxxtest/TestSuite.h> 

class cptests : public CxxTest::TestSuite 
{ 
public: 

    void test1(void) 
    { 
     complex x; 

     TS_ASSERT_EQUALS(x.real(), 0); 
     TS_ASSERT_EQUALS(x.imag(), 0) 

    } 

}; 

auf der anderen Seite, wenn ich versuchen, einen anderen Konstruktor

complex x(5.0,5.0);

statt

complex x;

ich die Fehlermeldung zu nennen:

In file included from cptests.h:9:0, 
       from runner.cpp:23: 
cplex.h:45:15: warning: inline function 'constexpr complex::complex(double, double)' used but never defined 
    constexpr complex(const double real,const double img); 
      ^
Undefined symbols for architecture x86_64: 
    "complex::complex(double, double)", referenced from: 
     cptests::test1()  in ccpZuOPa.o 
ld: symbol(s) not found for architecture x86_64 
collect2: error: ld returned 1 exit status 

ich meine Konstrukteure funktionieren wissen: Ich habe prüfte sie innerhalb: Klassenkomplexes.

versucht, diese Probleme zu beheben ich ein paar Fragen:

Hat mein constexpr Konstruktor haben in meiner Header-Klasse definiert werden? auch wenn es bereits im Klassenkomplex definiert wurde.

Müssen diese Funktionen, die im Klassenkomplex definiert sind, innerhalb einer Klasse in der Headerdatei deklariert werden: in meinem Fall die Klasse: complex? Was ist mit Nichtmitgliedsfunktionen?

Antwort

1

Die erste Fehlermeldung ist wegen eines doppelten Symbols mit dem Namen _main. Das bedeutet eines von;

  • die Übersetzungseinheit, die main() definiert aufgeführt wird zweimal in dem Aufbau (beispielsweise die Objektdatei wird zweimal angegeben bei der Verknüpfung); oder

  • Die Definition von main() ist in einer Header-Datei, die in zwei Kompilierungseinheiten enthalten ist. Dies kann auch anzeigen, dass Sie #include d eine Quelldatei in einer Kopfzeile haben.

Die zweite Fehlermeldung (die Sie hatten, bevor Sie Ihre Frage, es zu entfernen bearbeitet) bedeutet, dass der Compiler denkt, dass Sie den Konstruktor mit drei Argumenten aufgerufen haben, nicht zwei (im Gegensatz zu Ihrer Beschreibung). Meine Vermutung ist ein Tippfehler, also denken Sie, Sie haben complex x(5.0,5.0) eingegeben, aber haben tatsächlich complex x(5.0, 5,0) eingegeben, d. H. , (Komma) anstelle von . (Dezimalpunkt).

Die Warnung über nicht definierte Konstruktoren spiegelt den Compiler wider, der Sichtbarkeit der Definition aller constexpr-Funktionen benötigt, andernfalls kann er sie nicht zur Kompilierungszeit auswerten.

Verwandte Themen