C ++,旧的LNK1169(和LNK2005)错误

时间:2011-04-18 13:03:41

标签: c++ compiler-errors lnk

我有4个文件,2个标题和2个cpp文件。

头文件一:

#ifndef complex_2
#define complex_2
#include<iostream>
#include<cmath>

using namespace std;

namespace comp
{
    class complex{
    protected:
        double re, im;
    public:
        complex(){re = im = 0;}
        complex(double re_in, double im_in){
            re = re_in;
            im = im_in;
        }
        ~complex(){}

        void set_re(double re_in){
            re = re_in;
        }
        void set_im(double im_in){
            im = im_in;
        }
        double get_re() const{
            return re;
        }
        double get_im() const{
            return im;
        }

        complex comp_conj() const{
            complex temp;
            temp.set_re(re);
            temp.set_im(-im);
            return temp;
        }

        complex operator + (const complex &c)const{
            complex temp(re + c.get_re(), im + c.get_im());
            return temp;
        }

        complex operator - (const complex &c)const{
            complex temp(re - c.get_re(), im - c.get_im());
            return temp;
        }

        complex operator * (const complex &c1)const{
            complex temp;
            double a(re), b(im), c(c1.get_re()), d(c1.get_im());
            temp.set_re(a*c - b*d);
            temp.set_im(b*c + a*d);
            return temp;
        }

        complex operator / (const complex &c1)const{
            complex temp;
            double a(re), b(im), c(c1.get_re()), d(c1.get_im());
            temp.set_re((a*c + b*d)/(pow(c,2) + pow(d,2)));
            temp.set_im((b*d - a*d)/(pow(c,2) + pow(d,2)));
            return temp;
        }

        double mod() const{
            return(sqrt(pow(re,2) + pow(im,2)));
        }

        double arg() const{
            return(atan(im/re));
        }

        friend ostream & operator << (ostream &mm, const complex &c);
    };
ostream & comp::operator<< (ostream &mm, const complex &c){
    if(c.get_im() >= 0){
        mm << "(" << c.get_re() << " + " << c.get_im() << "i)" << endl;
    }
    if(c.get_im() < 0){
        mm << "(" << c.get_re() << " - " << -(c.get_im()) << "i)" << endl;
    }
    return mm;
}
}
#endif

标头文件2:

#ifndef AC_Circuits_Header
#define AC_Circuits_Header
#include "Complex and Definitions.h"
#include<fstream>
#include<vector>
#include<string>

using namespace std;
using namespace comp;

class component{
public:
    virtual ~component(){}
    virtual void set_f(double m){}
    virtual double get_f() = 0;

    virtual complex impedance() = 0;
    virtual double reactance() = 0;
    virtual double phase_diff() = 0;
};

class resistor : public component{
protected:
    double R;
    bool para_or_series;
public:
    resistor(){R = para_or_series = 0;}
    resistor(double r_in, bool a){
        R = r_in;
        para_or_series = a;
    }
    ~resistor(){}

    double get_R(){return R;}
    void set_f(double m){}
    double get_f(){return 0;}

    complex impedance(){
        complex Z_R(R, 0);
        return Z_R;
    }

    double reactance(){return 0;}
    double phase_diff(){return 0;}
};

class capacitor : public component{
protected:
    double C, f;
    bool para_or_serie;
public:
    capacitor(){C = para_or_serie = 0;}
    capacitor(double c_in, bool a){
        C = c_in;
        para_or_serie = a;
    }
    ~capacitor(){}

    double get_C(){return C;}
    void set_f(double freq){f = freq;}
    double get_f(){return f;}

    complex impedance(){
        complex Z_C(0, (pow((2 * 3.14 * f * C), -1)));
        return Z_C;
    }

    double reactance(){
        return (-(pow((2 * 3.14 * f * C), -1)));
    }

    double phase_diff(){
        complex Z_C(0, (pow((2 * 3.14 * f * C), -1)));
        return Z_C.arg();   
    }
};

class inductor : public component{
protected:
    double L, f;
    bool para_or_series;
public:
    inductor() : L(0), para_or_series(0) {}
    inductor(double l_in, bool a) : L(l_in), para_or_series(a) {}
    ~inductor(){}

    double get_R(){return 0;}
    double get_C(){return 0;}
    void set_f(double b){f = b;}
    double get_f(){return f;}

    double reactance(){
        return (2 * 3.14 * f * L);  
    }

    complex impedance(){
        complex Z_L(0, (2 * 3.14 * f * L));
        return Z_L;
    }

    double phase_diff(){
        complex Z_L(0, (2 * 3.14 * f * L));
        return Z_L.arg();
    }
};

class circuit : public resistor, public capacitor, public inductor{
protected:
    complex Z_tot;
public:
    circuit() : Z_tot(0,0) {}
    circuit(bool a, resistor &R, capacitor &C, inductor &L){
        if(a == 1){
            Z_tot = R.impedance() + C.impedance() + L.impedance();
        }
        if(a == 0){
            complex one(1,0);
            Z_tot = one/(one/R.impedance() + one/C.impedance() + one/L.impedance());
        }
    }
    ~circuit(){}

    void set_f(){}
    double get_f(){return 0;}

    complex impedance(){}
    double reactance(){return 0;}
    double phase_diff(){return 0;}
};
#endif

cpp文件一:

#include "AC Circuits.h"

using namespace comp;

vector<component *> cmp;

void add_resistor(){
    double res;
    string p_or_s;
    bool a, b(1);

    cout << "You have chosen to add a resistor.\nPlease input the resistance in ohms.\n (If you do not want to add a resistor input 0)\n"; // add in 0 functionality
    cin >> res;
    while(b){
        cout << "Is the resistor connected in series or in parallel?\n";
        cin >> p_or_s;
        if(p_or_s == "Parallel" || p_or_s == "parallel" || p_or_s == "P" || p_or_s == "p"){
            a = 1;
            b = 0;
        }
        if(p_or_s == "Series" || p_or_s == "series" || p_or_s == "S" || p_or_s == "s"){
            a = 0;
            b = 0;
        }
        else{
            cerr << "ERROR: Your selection is invlaid, please input whether the resistor is connected in series or in parallel.\n";
        }
    }

    cmp.push_back(new resistor(res, a));
}

void add_capacitor(){
    double cap;
    string p_or_s;
    bool a, b(1);

    cout << "You have chosen to add a capacitor.\nPlease input the capacitance in ohms.\n (If you do not want to add a capacitor input 0)\n";
    cin >> cap;
    while(b){
        cout << "Is the capacitor connected in series or in parallel?\n";
        cin >> p_or_s;
        if(p_or_s == "Parallel" || p_or_s == "parallel" || p_or_s == "P" || p_or_s == "p"){
            a = 1;
            b = 0;
        }
        if(p_or_s == "Series" || p_or_s == "series" || p_or_s == "S" || p_or_s == "s"){
            a = 0;
            b = 0;
        }
        else{
            cerr << "ERROR: Your selection is invlaid, please input whether the capactior is connected in series or in parallel.\n";
        }
    }
    cmp.push_back(new capacitor(cap, a));
}

void add_inductor(){
    double ind;
    string p_or_s;
    bool a, b(1);

    cout << "You have chosen to add an inductor.\nPlease input the inductance in henries.\n (If you do not want to add an inductor input 0)\n";
    cin >> ind;
    while (b){
        cout << "Is the inductor connected in series or in parallel?\n";
        cin >> p_or_s;
        if(p_or_s == "Parallel" || p_or_s == "parallel" || p_or_s == "P" || p_or_s == "p"){
            a = 1;
            b = 0;
        }
        if(p_or_s == "Series" || p_or_s == "series" || p_or_s == "S" || p_or_s == "s"){
            a = 0;
            b = 0;
        }
        else{
            cerr << "ERROR: Your selection is invlaid, please input whether the resistor is connected in series or in parallel.\n";
        }
    }
    cmp.push_back(new inductor(ind, a));
}

cpp文件二:

#include "AC Circuits.h"

int main(){
    return 0;
}

当我将main移动到第一个cpp文件的末尾时没有问题,而当它在自己的cpp文件中时,LNK1169和LNK2005会出现,但我宁愿将main作为单独的cpp文件。< / p>

如果涉及到它,我会将它标记到第一个cpp的末尾,但希望它不会出现。

2 个答案:

答案 0 :(得分:2)

移动

的定义
std::ostream & operator<< (ostream &mm, const comp::complex &c)

在其中一个CPP文件中。

链接器不喜欢这个。就个人而言,我也会为这个创建一个新的cpp文件:)

答案 1 :(得分:2)

在头文件中定义独立函数(带主体)时,必须使用内联(默认情况下,类定义中定义的函数是内联的)。

E.g。在头文件中,必须是:

inline ostream& operator<< (ostream &mm, const complex &c){
    if(c.get_im() >= 0){
        mm << "(" << c.get_re() << " + " << c.get_im() << "i)" << endl;
    }
    if(c.get_im() < 0){
        mm << "(" << c.get_re() << " - " << -(c.get_im()) << "i)" << endl;
    }
    return mm;
}

否则,您将在包含该标题的每个翻译单元中定义此函数,因此可能会出现多个定义错误。