重载不适用于 <<
Overloading doesn't work for <<
我有这段代码,但我无法想象如何重载 << 运算符:
ostream& operator<<(ostream& out)
{int check=0;
node *temp;
temp=this->head->next;
if(this->head->info==0)
out<<"- ";
while(temp!=NULL)
{ if(temp->info)
{out<<temp->info<<" ";
check=1;
temp=temp->next;}
else if(temp->info==0&&check==1)
{out<<temp->info<<" ";
temp=temp->next;}
else temp=temp->next;
}
return out;
}
我在 class 中有一个结构,希望输出一个大数字。大数是用链表创建的。重载方法在 class 内,我得到错误:当我使用
时,运算符 << 不匹配
cout<< B;
在主内。
有关上述代码的更多详细信息。检查变量是为了确保像 00100 这样的数字被打印为 100。如果 head->info ==0 数字为负数,如果为 1,则数字为正数。我从 head->next 开始,因为第一个节点有数字符号。
你做错了...... class 中的重载运算符允许你使用 class 作为运算符的左操作数......所以基本上你可以现在正在做 B << cout;
。
您需要在定义了 class 的命名空间中将运算符作为函数重载 ,如下所示:
ostream& operator<<(ostream& out, TYPE_OF_YOUR_CLASS_HERE v)
{
int check=0;
node *temp;
temp=b.head->next;
if(v.head->info==0)
out<<"- ";
while(temp!=NULL)
{
if(v.info) {
out<<v.info<<" ";
check=1;
temp=temp->next;
} else if(temp->info==0&&check==1) {
out<<temp->info<<" ";
temp=temp->next;
}
else
temp=temp->next;
}
return out;
}
正如 Alper 所建议的,您还需要让操作员<<成为您 class 的朋友,以便能够访问 class:
的私有字段
class MY_CLASS {
...
friend ostream& operator<< (ostream& out, MY_CLASS v);
};
如果要允许 class 类型恰好位于二元运算符右侧的表达式,请首选全局 operator<<
重载。
std::ostream& operator<<(std::ostream& os, const YourClassType& B)
此外,如果需要访问私有成员,则设为friend
。否则简单地使它成为非友元非成员函数。
如果您想要标准语法,operator<<
重载不能是成员函数 - 您必须将其称为 B << cout
,这远非好的。
(对于所有二元运算符,B.operator<<(cout)
表示 B
是左侧。)
这是我通常做的。
一个命名的常规成员函数:
ostream& output(ostream& out) const
{
// Your code here.
}
和一个只调用它的运算符:
ostream& operator<<(ostream& os, const MyClass& c)
{
return c.output(os);
}
我有这段代码,但我无法想象如何重载 << 运算符:
ostream& operator<<(ostream& out)
{int check=0;
node *temp;
temp=this->head->next;
if(this->head->info==0)
out<<"- ";
while(temp!=NULL)
{ if(temp->info)
{out<<temp->info<<" ";
check=1;
temp=temp->next;}
else if(temp->info==0&&check==1)
{out<<temp->info<<" ";
temp=temp->next;}
else temp=temp->next;
}
return out;
}
我在 class 中有一个结构,希望输出一个大数字。大数是用链表创建的。重载方法在 class 内,我得到错误:当我使用
时,运算符 << 不匹配 cout<< B;
在主内。
有关上述代码的更多详细信息。检查变量是为了确保像 00100 这样的数字被打印为 100。如果 head->info ==0 数字为负数,如果为 1,则数字为正数。我从 head->next 开始,因为第一个节点有数字符号。
你做错了...... class 中的重载运算符允许你使用 class 作为运算符的左操作数......所以基本上你可以现在正在做 B << cout;
。
您需要在定义了 class 的命名空间中将运算符作为函数重载 ,如下所示:
ostream& operator<<(ostream& out, TYPE_OF_YOUR_CLASS_HERE v)
{
int check=0;
node *temp;
temp=b.head->next;
if(v.head->info==0)
out<<"- ";
while(temp!=NULL)
{
if(v.info) {
out<<v.info<<" ";
check=1;
temp=temp->next;
} else if(temp->info==0&&check==1) {
out<<temp->info<<" ";
temp=temp->next;
}
else
temp=temp->next;
}
return out;
}
正如 Alper 所建议的,您还需要让操作员<<成为您 class 的朋友,以便能够访问 class:
的私有字段class MY_CLASS {
...
friend ostream& operator<< (ostream& out, MY_CLASS v);
};
如果要允许 class 类型恰好位于二元运算符右侧的表达式,请首选全局 operator<<
重载。
std::ostream& operator<<(std::ostream& os, const YourClassType& B)
此外,如果需要访问私有成员,则设为friend
。否则简单地使它成为非友元非成员函数。
operator<<
重载不能是成员函数 - 您必须将其称为 B << cout
,这远非好的。
(对于所有二元运算符,B.operator<<(cout)
表示 B
是左侧。)
这是我通常做的。
一个命名的常规成员函数:
ostream& output(ostream& out) const
{
// Your code here.
}
和一个只调用它的运算符:
ostream& operator<<(ostream& os, const MyClass& c)
{
return c.output(os);
}