简体   繁体   中英

Operator overflow function call not being called correctly

So, I'm getting an error, error C4930 in VS 2012, saying

prototyped function not called (was a variable definition intended?)

Basically all of the function calls I made with my operator overflow functions aren't being called correctly for some reason. I've seen in some people writing their function calls like this

Comp_Num Comp_Num::operator- (Comp_Num &c1, Comp_Num &c2);

When I add in Comp_Num:: the text editor in VS underlines operator with a red squiggle.

I'm also getting 3 Link 2001 errors. There's something wrong with the variable declaration I made for double r1_final and r2_final. I think they aren't initializing their variables outside of their function calls. This is the error message in total.

c:\users\andrew\documents\visual studio 2012\projects\andrew_spiteri_hw5\complex_number.h(226): warning C4930: 'Comp_Num operator +(Comp_Num &,Comp_Num &)': prototyped function not called (was a variable definition intended?)
c:\users\andrew\documents\visual studio 2012\projects\andrew_spiteri_hw5\complex_number.h(228): warning C4930: 'Comp_Num operator -(Comp_Num &,Comp_Num &)': prototyped function not called (was a variable definition intended?)
c:\users\andrew\documents\visual studio 2012\projects\andrew_spiteri_hw5\complex_number.h(230): warning C4930: 'Comp_Num operator *(Comp_Num &,Comp_Num &)': prototyped function not called (was a variable definition intended?)
Complex_Number.obj : error LNK2001: unresolved external symbol "private: static class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > Comp_Num::imag1" (?imag1@Comp_Num@@0V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@A)
Complex_Number.obj : error LNK2001: unresolved external symbol "public: static double Comp_Num::r1_final" (?r1_final@Comp_Num@@2NA)
Complex_Number.obj : error LNK2001: unresolved external symbol "public: static double Comp_Num::r2_final" (?r2_final@Comp_Num@@2NA)

Here's the code. The section I'm talking about is toward the bottom in the operation() function. Thanks in advance.

#include <iostream>
#include <String>
#include <vector>
#include <sstream>

using namespace std;

#ifndef Comp_Num
class Comp_Num
{
private:
    std::vector <double> real;
    std::vector <double> imag;
    double real_in, real_in1, real_in2;
    static double r1_final, r2_final;
    std::string imag_in; 
    static std::string imag1;
public:
    Comp_Num();
    Comp_Num(double real_num, std::string img_num);

    static std::vector <std::string> get_input();
    static std::vector <std::string> get_real(std::vector <string> complexnum1);
    static std::vector <std::string> get_imag(std::vector <std::string> complexnum2);
    static void display(std::vector <std::string> display1);
    static void display2(std::vector <double> display3);
    static std::vector <std::string> set_compnum();
    static std::vector <std::string> comp2real(std::vector <std::string> c2r);
    static std::vector <double> real2double (std::vector<std::string> r2d);
    static double double_const(std::vector<double> dc);
    friend Comp_Num operator +(const Comp_Num &c3, const Comp_Num &c4);
    friend Comp_Num operator -(const Comp_Num &c3, const Comp_Num &c4);
    friend Comp_Num operator *(const Comp_Num &c3, const Comp_Num &c4);
    static void operation();
    ~Comp_Num();
/*
    double Comp_Num::operator+ (double add_num);
    double Comp_Num::operator- (double sub_num);
    double Comp_Num::operator* (double mul_num);
    double Comp_Num::operator/ (double div_num);
*/
};
#endif !Comp_Num

Comp_Num::Comp_Num()
{
    double real_in = 1;
    string imag_in = "i";
};

Comp_Num::Comp_Num(double real_num, std::string imag_num)
{
    double real_in = real_num;
    string imag_in = imag_num;
};

std::vector <string> Comp_Num::set_compnum()
{
    std::vector <string>set_num= Comp_Num::get_input();
    std::vector<string>comp1=Comp_Num::get_real(set_num);
    std::vector <string>comp2= Comp_Num::get_imag(set_num);
    std::vector <string>cmp2rl_fin = Comp_Num::comp2real(comp2);
    std::vector<double>finale = Comp_Num::real2double(cmp2rl_fin);
    Comp_Num::double_const (finale);
    imag1 = "i";
    Comp_Num *c1 = new Comp_Num(r1_final, imag1);
    Comp_Num *c2 = new Comp_Num(r2_final, imag1);

    Comp_Num::display(comp2);
    std::system("pause");
    return(comp2);
};

std::vector <string> Comp_Num::get_input()
{
    std::string usr_input, input1;
    std::vector <string> complex;
    std::cout<<"Enter 2 imaginary numbers you would like to perform your operation on.\n";
    std::getline(std::cin, usr_input);
    std::istringstream input(usr_input);
    while(input >> input1)
    {
        complex.push_back(input1);
    }
    std::cout<<'\n';
    return (complex);
};

std::vector <string> Comp_Num::get_imag(std::vector <string> complexnum2)
{
    std::vector <string> imag1;
    for(unsigned int i = 0; i < complexnum2.size(); ++i)
    {
        std::string str2 = "";
        std::vector<char> char1(complexnum2[i].begin(), complexnum2[i].end());
        for(unsigned int r = 0; r < char1.size(); ++r)
        {
            if(char1[r] >= '0' && char1[r] <= '9' || char1[r] == '-' || char1[r] == '.' || char1[r] == 'i')
            {
                str2 += char1[r];
                if(char1[r] == 'i')
                {
                    imag1.push_back(str2);  
                    continue;
                }
            }
        }
    }
    return(imag1);
};

std::vector <string> Comp_Num::get_real(std::vector <string> complexnum1)
{
    std::vector <string> real1;
    for(unsigned int i = 0; i < complexnum1.size(); ++i)
    {
        std::string str2 = "";
        std::vector<char> char1(complexnum1[i].begin(), complexnum1[i].end());
        for(unsigned int r = 0; r < char1.size(); ++r)
        {
            if(char1[r] >= '0' && char1[r] <= '9' || char1[r] == '-' || char1[r] == '.' || char1[r] == 'i')
            {
                str2 += char1[r];
                if(char1[r] == 'i')
                {
                    str2="";
                    break;
                }
            }
        }
        real1.push_back(str2);
    }
    return(real1);
};

void Comp_Num::display (std::vector <string> display1)
{
    unsigned int i = 0;
    while (i < display1.size())
    {
        std::cout<<display1[i]<<" ";
        i++;
    }
    std::cout<<std::endl;
};

void Comp_Num::display2 (std::vector <double> display3)
{
    unsigned int i = 0;
    while (i < display3.size())
    {
        std::cout<<display3[i]<<" ";
        i++;
    }
    std::cout<<std::endl;
};

std::vector <string> Comp_Num::comp2real(std::vector <string> c2r)
{
    std::vector <string> real2;
    for(unsigned int i = 0; i < c2r.size(); ++i)
    {
        std::string str2 = "";
        std::vector<char> char1(c2r[i].begin(), c2r[i].end());
        for(unsigned int r = 0; r < char1.size(); ++r)
        {
            if(char1[r] >= '0' && char1[r] <= '9' || char1[r] == '-' || char1[r] == '.')
            {
                str2 += char1[r];
            }
        }
        real2.push_back(str2);
    }
    return(real2);
}

std::vector<double> Comp_Num::real2double (std::vector<string> r2d)
{
    double y;
    std::vector<double> final_r2d;
    std::string str, str2;
    std::vector<string>str3;
    for(unsigned int i = 0; i < r2d.size(); ++i)
    {
        std::vector<char> ch(r2d[i].begin(), r2d[i].end());
        for(unsigned int r = 0; r < ch.size(); ++r)
        {
            if(ch[r] >= '0' && ch[r] <= '9' || ch[r] == '-' || ch[r] == '.')
            {
                str2 += ch[r];  
            }
        }
        str3.push_back(str2);
        str2="";
    }
    for(unsigned int r = 0; r < str3.size(); r++)
    {
        str = str3[r];
        std::istringstream to_double(str);
        while(to_double >> y)
        {
            final_r2d.push_back(y);
        }
    }
    return(final_r2d);
};

double Comp_Num::double_const(std::vector<double>dc)
{
    r1_final=dc[0];
    r2_final=dc[1];
    return(0);
};

void Comp_Num::operation()
{
    std::string operate;
    std::cout<<"What operation would you like perform on the numbers?\n";
    std::cout<<"You may choose between addition, subtraction, and multiplication.\n";
    std::getline(cin,operate);
    if(operate == "addition")
        Comp_Num operator+ (Comp_Num &c1, Comp_Num &c2);
    else if (operate == "subtraction")
        Comp_Num operator- (Comp_Num &c1, Comp_Num &c2);
    else if (operate == "multiplication")
        Comp_Num operator* (Comp_Num &c1, Comp_Num &c2);
    else
    {
        cout<<"This is not a valid entry.  Please start over."<<std::endl;
        std::exit(0);
    }
};

Comp_Num operator +(const Comp_Num &c3, const Comp_Num &c4)
{
    std::string output,imaginary = "i";
    double final_real = c3.real_in + c4.real_in;
    std::cout<<"The difference of your imaginary numbers is "<<final_real<<imaginary<<std::endl;
    return(c3);
};

Comp_Num operator -(const Comp_Num &c3, const Comp_Num &c4)
{
    std::string output,imaginary = "i";
    double final_real = c3.real_in - c4.real_in;
    std::cout<<"The difference of your imaginary numbers is "<<final_real<<imaginary<<std::endl;
    return(c3);
};

Comp_Num operator *(const Comp_Num &c3, const Comp_Num &c4)
{
    std::string output,imaginary = "i";
    double final_real = c3.real_in * c4.real_in;
    final_real *= -1;
    std::cout<<"The difference of your imaginary numbers is "<<final_real<<std::endl;
    return(c3);
};

When you call these methods you are returning a Comp_Num Object. So in the main they should be called like:

   Comp_Num cm 
   if(operate == "addition")
   cm = c1 + c2;
   else if (operate == "subtraction")
   cm = c1 - c2;
   else if (operate == "multiplication")
   cm = c1 * c2;

These lines are the problem:

if(operate == "addition")
    Comp_Num operator+ (Comp_Num &c1, Comp_Num &c2);
else if (operate == "subtraction")
    Comp_Num operator- (Comp_Num &c1, Comp_Num &c2);
else if (operate == "multiplication")
    Comp_Num operator* (Comp_Num &c1, Comp_Num &c2);

If you want to use your operators, just use them as operators

Comp_num c1, c2, c3; // get these from somewhere.
if(operate == "addition")
    c3 = c1 + c2;
else if (operate == "subtraction")
    c3 = c1 - c2;
else if (operate == "multiplication")
    c3 = c1 * c2;

The other error is because you need to define static variables outside of the class. You can also initialize them at this point. Try something like this below your class definition:

double Comp_Num::r1_final = 0;

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM