1

我有 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 文件。

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

4

3 回答 3

2

移动定义

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

在其中一个 CPP 文件中。

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

于 2011-04-18T13:29:58.150 回答
2

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

例如,在头文件中必须是:

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;
}

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

于 2011-04-18T14:43:48.730 回答
0

使用结构复制 LNK1169 和 LNK2005 的示例:将以下内容放在头文件中:

    Struct Foo
    {
    std::wstring Bar[3]
    };

    Foo InitFoo[2]
    {
    {L"ConstBar1Val", L"ConstBar1Val2", L"ConstBar1Val3"},
    {L"ConstBar2Val", L"ConstBar2Val2", L"ConstBar3Val3"}
    };

解决方案:将初始化的struct & arrays移动到对应的cpp文件中。

于 2018-02-26T11:37:59.370 回答