Reputation: 45
I'm using this class complex in a program to parse equations
class complex
{
double real;
double imag;
stringstream complexStr;
public:
complex(double re = 0, double im = 0)
{
real = re;
imag = im;
complexStr<<real<<"+j"<<imag;
}
complex(complex &t)
{
real = t.real;
imag = t.imag;
}
void StrtoComplex(char *temp)
{
int i;
for(i = 0; i < strlen(temp); i++)
if(temp[i] == 'j' || temp[i] == 'i')
break;
real = atof(temp);//takes till the last valid char so after + or whitespace it ignores
imag = atof(temp + i + 1);
complexStr<<real<<"+j"<<imag;
}
friend complex operator+(complex &a, complex &b);
friend complex operator-(complex &a, complex &b);
friend complex operator-(complex &a);
friend complex operator*(complex &a, complex &b);
friend complex operator/(complex &a, complex &b);
friend ostream &operator<<(ostream &s, complex &t);
friend istream &operator>>(istream &s, complex &t);
};
//overloading + to add complex numbers
complex operator +(complex &a, complex &b)
{
complex t;
t.real = a.real + b.real;
t.imag = a.imag + b.imag;
return(t);
}
//overaloading - to subtract 2 complex no's
complex operator -(complex &a, complex &b)
{
complex t;
t.real = a.real - b.real;
t.imag = a.imag - b.imag;
return(t);
}
//overloading unary -
complex operator -(complex &a)
{
complex t(-a.real, -a.imag);
return(t);
}
//overloading * to multiply 2 complex no's
complex operator *(complex &a, complex &b)
{
complex t;
t.real = (a.real*b.real) - (a.imag*b.imag);
t.imag = (a.real*b.imag) + (a.imag*b.real);
return(t);
}
//overloading / to divide 2 complex no's
complex operator /(complex &a, complex &b)
{
complex t;
t.real = ((a.real*b.real) + (a.imag*b.imag))/(b.real*b.real + b.imag*b.imag);
t.imag = ((a.real*b.imag) - (a.imag*b.real))/(b.real*b.real + b.imag*b.imag);
return(t);
}
ostream &operator<<(ostream &s, complex &t)
{
s<<t.complexStr.str();
return s;
}
istream &operator>>(istream &s, complex &t)
{
char *temp;
s>>temp;
t.StrtoComplex(temp);
return s;
}
and I'm receiving this error:
error C2248: 'std::basic_ios<_Elem,_Traits>::basic_ios' : cannot access private member declared in class 'std::basic_ios<_Elem,_Traits>'
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\ios(176) : see declaration of 'std::basic_ios<_Elem,_Traits>::basic_ios'
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>
1> ]
1> This diagnostic occurred in the compiler generated function 'std::basic_stringstream<_Elem,_Traits,_Alloc>::basic_stringstream(const std::basic_stringstream<_Elem,_Traits,_Alloc> &)'
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>,
1> _Alloc=std::allocator<char>
1> ]
Please help I tried searching around but the answers seem to be specific to the program so posted this question.
Upvotes: 0
Views: 185
Reputation: 110202
Your complex
class has a std::stringstream
member. When the compiler generates a copy constructor for complex
, it will try to call the copy constructor for std::stringstream
. But this fails because stringstream
objects can't be copied.
I suggest you remove the stringstream
member, and just write the needed fields to the output stream in your operator<<
instead. If you want to make the string representation a member of the class, use an std::string
member instead.
If you really want to have a stringstream
member (not recommended), you need to create your own copy constructor instead of the compiler-generated one.
Upvotes: 5