Scholieren.com forum

Scholieren.com forum (https://forum.scholieren.com/index.php)
-   Software & Hardware (https://forum.scholieren.com/forumdisplay.php?f=20)
-   -   [C++]3 losse modules linken => linking error (https://forum.scholieren.com/showthread.php?t=705692)

Dr HenDre 29-12-2003 18:02

[C++]3 losse modules linken => linking error
 
Ik ben aan het expirimenteren met het werken met losse modules. Nu heb ik een project in MSVC6++ bestaande uit 3 bestanden nl

abc.h
Code:

class vkv
{
public:
        void coeff(double aa, double bb, double cc);
        bool losOp();
       
        double wortel1() const
        {
                return x1;
        }
       
        double wortel2() const
        {
                return x2;
        }
private:
        double a, b, c, x1, x2;
};

abcimpl.cpp
Code:

#include <cmath>
#include "abc.h"

void vkv::coeff(double aa, double bb, double cc)
{
        a = aa;
        b = bb;
        c = cc;
}

bool vkv::losOp()
{
        double D = b * b - 4 * a * c;
        if (a == 0 || D < 0)
        {
                return false;
        }
        double wD = sqrt(D);
        x1 = (-b + wD)/(2 * a);
        x1 = (-b - wD)/(2 * a);
        return true;
}

abcapp.cpp
Code:

#include <iostream>
#include "abcimpl.cpp"
using namespace std;

int main()
{
        double a, b, c;
        cout << "Typ a, b, en c in: ";
        cin >> a >> b >> c;
        vkv v;
        v.coeff(a, b, c);
        if (v.losOp())
        {
                cout << "Wortels: " << v.wortel1()
                        << " " << v.wortel2() << endl;
        }
        else
                cout << "Geen reele wortels.\n";
        return 0;
}

Nu gaat het compilen goed, maar bij het linken krijg ik 3 erros:

Code:

Compiling...
abcimpl.cpp
Linking...
abcapp.obj : error LNK2005: "public: void __thiscall vkv::coeff(double,double,double)" (?coeff@vkv@@QAEXNNN@Z) already defined in abcimpl.obj
abcapp.obj : error LNK2005: "public: bool __thiscall vkv::losOp(void)" (?losOp@vkv@@QAE_NXZ) already defined in abcimpl.obj
Debug/abcformule.exe : fatal error LNK1169: one or more multiply defined symbols found

De tips van msdn hebben niet echt geholpen :(
Iemand een idee

Speedo 30-12-2003 16:13

Eej,

wat je zou kunnen proberen is een conditionele compilatie

vb. (bij conventie:-)
#if !defined __ABC_H__
#define __ABC_H__
// jouw-klassedefinitie
#endif // !__ABC_H__

probeer dit eerst ns en kijk wat de preprocessor dan zegt. Daarna zien we wel verder

Speedo 30-12-2003 16:18

Ownee ik zie t al (DOM dat ik t niet meteen zag)

je moet alleen je h-file #include-n (geloof dat t bij jouw abc.h) heette.

En btw. zoek naar een meer intressante oplossing voor een vierkantsvergelijking. Experimenteer maar eens met de reststelling en de factorstelling. Daarmee kun je je klasse makkelijker uitbreiden naar polynoomvergelijkingen. En maak dr een template van zodattie niet alleen double's maar bijvoorbeeld ook integers en misschien later ook complexe getallen kan accepteren. Welk boek gebruik je trouwens om c++ uit te leren. Die van Leen Ammeraal of hoe heettie ook weer?

Tip: The C++ Programming Language (Bjarne Stroustrup is beter en vollediger. Meneer Ammeraal snapt bijvoorbeeld niet het verschil tussen een conditionele expressie en een exceptie-handler: de kneus).

suc7

Screaming Slave 30-12-2003 17:06

juist. hoe beter c++ leren dan van de persoon die het bedacht heeft :cool:

Dr HenDre 30-12-2003 17:17

hoezo alleen de header includen? Als ik nog een 3de bestand heb dan wordt dat nergens opgenomen :confused:

Screaming Slave 30-12-2003 17:25

tuurlijk wel, msvc compilet de files gewoon een voor een tot object files en linkt ze daarna met gebruikte libraries tot een executable.

deathz0rz 30-12-2003 17:29

note: je hebt:

x1 = (-b + wD)/(2 * a);
x1 = (-b - wD)/(2 * a);

Dr HenDre 30-12-2003 18:54

Citaat:

deathz0rz schreef op 30-12-2003 @ 18:29:
note: je hebt:

x1 = (-b + wD)/(2 * a);
x1 = (-b - wD)/(2 * a);

how, thnx (y) :) :cool:


Alle tijden zijn GMT +1. Het is nu 06:21.

Powered by vBulletin® Version 3.8.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.