class complex1
{
public:
int real,img;
complex1(){}
complex1(int a)
{
real=a;
img=a;
}
complex1(int a,int b)
{
real=a;
img=b;
}
complex1 sum(int x,complex1 y);
complex1 sum(complex1,complex1);
complex1 display(complex1);
};
complex1 complex1::sum(int x,complex1 y)
{
complex1 num;
num.real=x+y.real;
num.img=y.img;
return num;
}
complex1 complex1::sum(complex1 a,complex1 b)
{
complex1 num;
num.real=a.real+b.real;
num.img=a.img+b.img;
return num;
}
complex1 complex1::display(complex1 c)
{
cout<<"The complex number is:\n";
cout<<c.real<<"+i"<<c.img;
}
main()
{
complex1 p,q,r,s;
p=complex1(2,4);
q=complex1 (3,5);
cout<<"\n";
cout<<"p="<<display(p);
cout<<"q="<<display(q);
}
使用构造函数我们需要添加两个复数。我收到了错误
错误:未在此范围内声明显示。
有什么建议吗?我哪里错了?
答案 0 :(得分:1)
您收到此错误是因为您在实例方法实现之外调用display()
而未在complex1
的实例上调用它,因此编译器不知道在哪里找到它
您需要将其称为p.display(p)
。
但是,您有几个更严重的错误:
sum()
和display()
方法不会对this
执行任何操作,因此它们的行为与静态方法类似,但仍需要实例。这令人困惑。让它们变得静止。 (无论如何,sum()
方法应该可以实现为+
运算符重载。)
display()
方法应该实现为<<
运算符重载,将std::ofstream&
作为左操作数,它应该返回std::ofstream&
而不是一个complex1
个对象。 (在你的实现中,它甚至根本不会返回一个complex1
对象,即使它被声明为。这是一个错误。)
例如,要修复第一个点,我会完全删除sum()
方法并使用自由运算符,如下所示:
complex1 operator+(complex1 const & a, complex1 const & b)
{
return complex1(a.real + b.real, a.img + b.img);
}
由于您的complex1(int)
构造函数是隐式隐式的(哈!),此运算符可以自动与complex1 + complex1
,complex1 + int
和int + complex1
一起使用。 (但请注意,您的complex1(int)
构造函数会将参数分配给real
和img
,这可能是一个错误;我希望您希望将img
初始化为零。)
要解决第二个问题,我会完全删除您的display()
方法并使用免费的运算符,如下所示:
std::ofstream & operator<<(std::ofstream & s, complex1 const & c)
{
return s << c.real << "+i" << c.img;
}
然后,要输出一个数字,您可以执行以下操作:
std::cout << "p=" << p;
答案 1 :(得分:0)
您的display
函数需要返回一个complex1
对象,就像您在课堂上所说的那样。否则,您可以将存根更改为
void display(complex1);
此外,display
是成员函数,这意味着需要在类实例上调用它。你需要做
p.display();
此外,您可以为sum
和其他+
的{{1}}运算符重载,而不是使用int
函数:
complex1