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?