Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Fehlermeldung "multiple definition"

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
06.11.2005, 18:16 Uhr
~Paul472
Gast


Hallo!

Ich bin gerade beim Einstieg in C++. Ich habe mir eine Klasse CComplex erstellt, mit der ich komplexe Zahlen realisieren möchte (Quellcode siehe unten). In der main-datei binde ich CComplex.cpp ein. Variablen deklariere ich z.b. mit CComplex point(0.0,0.0). Ich kann den Code aber nicht compilieren. Als Fehlermeldung erhalte ich:

multiple definition of `CComplex::CComplex(double, double)'
first defined here

Und das für jede Memberfunktion. Es stehen keine Zeilenangaben dabei, außerdem sehe ich überhaupt nicht, wo ich da etwas mehrmals definiere.

Kann mir jemand bei dem Problem helfen?

(Als Compiler benutze ich den, der bei Bloodshed Def-C++ Version 4.9.9.2 dabei ist. Wo sehe ich, welcher genau das ist? )

Danke für jeden Hinweis!
Paul

//CComplex.h
class CComplex
{
public:
CComplex(double re, double im);
double GetRe();
double GetIm();
void SetRe(double re);
void SetIm(double im);

private:
double m_re;
double m_im;
};


//CComplex.cpp
#include "CComplex.h"

CComplex::CComplex(double re, double im)
{
m_re = re;
m_im = im;
}

double CComplex::GetRe()
{
return m_re;
}

double CComplex::GetIm()
{
return m_im;
}

void CComplex::SetRe(double re)
{
m_re = re;
}

void CComplex::SetIm(double im)
{
m_im = im;
}
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
06.11.2005, 18:27 Uhr
Pler
Einer von Vielen
(Operator)


Zeig mal noch den main.cpp.

Ausserdem ist es immer hilfreich, wenn du tags benutzt. (Beispiele siehe links unter 'Quellcode')
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
06.11.2005, 18:35 Uhr
~Paul472
Gast


Okay, hier ist die main.cpp, schon etwas länger geworden...



C++:
#include <windows.h>
#include <math.h>
#include "CComplex.cpp"

/*  Declare Windows procedure  */
LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);

void paint(HDC hdc);

// Complex operations
CComplex add(CComplex a, CComplex b);
CComplex sub(CComplex a, CComplex b);
CComplex div(CComplex a, CComplex b);
CComplex mul(CComplex a, CComplex b);
double dist(CComplex a, CComplex b);


CComplex func(CComplex x);
CComplex deriv(CComplex x);
HBRUSH color(CComplex x);

/*  Make the class name into a global variable  */
char szClassName[ ] = "WindowsApp";

int WINAPI WinMain (HINSTANCE hThisInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpszArgument,
                    int nFunsterStil)

{
    HWND hwnd;               /* This is the handle for our window */
    MSG messages;            /* Here messages to the application are saved */
    WNDCLASSEX wincl;        /* Data structure for the windowclass */

    /* The Window structure */
    wincl.hInstance = hThisInstance;
    wincl.lpszClassName = szClassName;
    wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */
    wincl.style = CS_DBLCLKS;                 /* Catch double-clicks */
    wincl.cbSize = sizeof (WNDCLASSEX);

    /* Use default icon and mouse-pointer */
    wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
    wincl.hCursor = LoadCursor (NULL, IDC_ARROW);
    wincl.lpszMenuName = NULL;                 /* No menu */
    wincl.cbClsExtra = 0;                      /* No extra bytes after the window class */
    wincl.cbWndExtra = 0;                      /* structure or the window instance */
    /* Use Windows's default color as the background of the window */
    wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;

    /* Register the window class, and if it fails quit the program */
    if (!RegisterClassEx (&wincl))
        return 0;

    /* The class is registered, let's create the program*/
    hwnd = CreateWindowEx (
           0,                   /* Extended possibilites for variation */
           szClassName,         /* Classname */
           "Windows App",       /* Title Text */
           WS_OVERLAPPEDWINDOW, /* default window */
           CW_USEDEFAULT,       /* Windows decides the position */
           CW_USEDEFAULT,       /* where the window ends up on the screen */
           544,                 /* The programs width */
           375,                 /* and height in pixels */
           HWND_DESKTOP,        /* The window is a child-window to desktop */
           NULL,                /* No menu */
           hThisInstance,       /* Program Instance handler */
           NULL                 /* No Window Creation data */
           );

    /* Make the window visible on the screen */
    ShowWindow (hwnd, nFunsterStil);

    /* Run the message loop. It will run until GetMessage() returns 0 */
    while (GetMessage (&messages, NULL, 0, 0))
    {
        /* Translate virtual-key messages into character messages */
        TranslateMessage(&messages);
        /* Send message to WindowProcedure */
        DispatchMessage(&messages);
    }

    /* The program return-value is 0 - The value that PostQuitMessage() gave */
    return messages.wParam;
}


/*  This function is called by the Windows function DispatchMessage()  */

LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    PAINTSTRUCT ps;
    HDC hdc;
    
    switch (message)                  /* handle the messages */
    {
        case WM_PAINT:
            {
                hdc = BeginPaint(hwnd, &ps);
                paint(hdc);
                EndPaint(hwnd, &ps);
            }
            break;
        case WM_DESTROY:
            PostQuitMessage (0);       /* send a WM_QUIT to the message queue */
            break;
        default:                      /* for messages that we don't deal with */
            return DefWindowProc (hwnd, message, wParam, lParam);
    }

    return 0;
}

void paint(HDC hdc)
{
    RECT rect;
    CComplex point(0.0,0.0);
    
    for (int i=0; i<601; i++)
    {
        for (int j=0; j<401; j++)
        {
            point.SetRe(i);
            point.SetIm(j);
            
            rect.left=i;
            rect.right=i+1;
            rect.top=j;
            rect.bottom=j+1;
            
            FillRect(hdc,&rect,color(point));
        }
    }
}

// complex adition
CComplex add(CComplex a, CComplex b)
{
    CComplex result(0.0,0.0);
    result.SetRe( a.GetRe()+b.GetRe() );
    result.SetIm( a.GetIm()+b.GetIm() );
    return result;
}

// complex subtraction
CComplex sub(CComplex a, CComplex b)
{
    CComplex result(0.0,0.0);
    result.SetRe( a.GetRe()-b.GetRe() );
    result.SetIm( a.GetIm()-b.GetIm() );
    return result;
}

// complex divison
CComplex div(CComplex a, CComplex b)
{
    CComplex result(0.0,0.0);
    result.SetRe( a.GetRe()*b.GetRe()-a.GetIm()*b.GetIm() );
    result.SetIm( a.GetRe()*b.GetIm()+a.GetIm()*b.GetRe() );
    return result;
}

// complex multiplication
CComplex mul(CComplex a, CComplex b)
{
    CComplex result(0.0,0.0);
    result.SetRe( (a.GetRe()*b.GetRe()+a.GetIm()*b.GetIm())/(a.GetIm()*a.GetIm()+b.GetIm()*b.GetIm()) );
    result.SetIm( (a.GetIm()*b.GetRe()-a.GetRe()*b.GetIm())/(a.GetIm()*a.GetIm()+b.GetIm()*b.GetIm()) );
    return result;
}

// distance
double dist(CComplex a, CComplex b)
{
    return ( sqrt((a.GetRe()-b.GetRe())*(a.GetRe()-b.GetRe()) + (a.GetIm()-b.GetIm())*(a.GetIm()-b.GetIm())) );
}

CComplex func(CComplex x)
{
    CComplex eins(1,0);
    return ( add(mul(mul(x,x),x),eins) );    
}

CComplex deriv(CComplex x)
{
    CComplex zwei(2,0);
    return ( mul(zwei,mul(x,x)) );
}

HBRUSH color(CComplex x)
{
    int count = 0;
        
    HBRUSH red = CreateSolidBrush(0x0000FF);
    HBRUSH blue = CreateSolidBrush(0xFF0000);
    HBRUSH green = CreateSolidBrush(0x00FF00);
    HBRUSH white = CreateSolidBrush(0xFFFFFF);
    HBRUSH black = CreateSolidBrush(0x000000);

    // zeropoints
    CComplex zeropoint1(-1,0);            // red
    CComplex zeropoint2(0.5,-0.866);    // blue
    CComplex zeropoint3(0.5,0.866);        // green
    
    CComplex x1(0,0);
    
    // Newton method
    do
    {        
        x1 = sub(x,div(func(x),deriv(x)));
        count++;
        x = x1;
        
    } while (dist(x1,x1) > 0.01 && count < 40 );
    
    if (count == 40) return white;
    
    if (dist(x1,zeropoint1) < dist(x1,zeropoint2))
    {
        if (dist(x1,zeropoint1) < dist(x1,zeropoint3)) return red;
        else return green;
    }
    else
    {
        if (dist(x1,zeropoint2) < dist(x1,zeropoint3)) return blue;
        else return green;
    }
    
    return black;
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
06.11.2005, 19:15 Uhr
Bruder Leif
dances with systems
(Operator)


Moin!

Du bindest die CPP-Datei ein, daher der Fehler. Du musst die .H-Datei einbinden, dann klappts!
--
Mit 40 Fieber sitzt man nicht mehr vor dem PC.
Man liegt im Bett.
Mit dem Notebook.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: