C++ 如何调试C++;上课? #包括 #包括 使用名称空间std; 阶级广场{ 公众: 内侧; 正方形(整数); void运算符==(平方); }; 正方形::正方形(整数s){ s=0; } 空方块::运算符==(方块s1){ if(side==s1.side){ cout
您的构造函数似乎与您期望它做的事情不一致。应该是这样的:C++ 如何调试C++;上课? #包括 #包括 使用名称空间std; 阶级广场{ 公众: 内侧; 正方形(整数); void运算符==(平方); }; 正方形::正方形(整数s){ s=0; } 空方块::运算符==(方块s1){ if(side==s1.side){ cout,c++,C++,您的构造函数似乎与您期望它做的事情不一致。应该是这样的: #include <stdio.h> #include <iostream> using namespace std; class square{ public: int side; square(int); void operator==( square); }; square::square( int s){ s=0; } void square::operator==(s
#include <stdio.h>
#include <iostream>
using namespace std;
class square{
public:
int side;
square(int);
void operator==( square);
};
square::square( int s){
s=0;
}
void square::operator==(square s1){
if (side == s1.side){
cout<<"True"<<endl;
}
else
cout<<"False"<<endl;
}
int main(){
square sq1(10);
square sq2(20);
square sq3(20);
sq1.operator==(sq2);
sq2.operator==(sq3);
}
构造函数应该初始化类中的变量int size。在构造函数中,您所做的是将参数的值设置为零,而不是类中的边本身。因此,它应该如下所示:
square::square(int-s)
{
侧面=s;
}
它们的值不相同
它们都有一个未指定的值,因为您从未初始化或分配到
侧
我已经整理了您的代码
- 比较运算符(运算符==)应具有此签名
bool T::operator==(常数T2&b)const;
- 您没有设置成员变量
- 我为构造函数添加了一个默认值,因此
端总是有一个已知值
- 您不需要显式调用
。只需使用操作符==
,编译器将使用最佳匹配==
- 对于这种情况,您可以只使用
转换方法,仍然调用运算符int
。我添加了一个,但注释了它,尝试一下,看看编译器将选择哪一个sq1==sq2
square::square( int s){ side = s; }
#包括 使用名称空间std; 阶级广场 { 内侧; 公众: 正方形(ints=0):边{} //运算符int(){return side;} //或者(对于本用例) bool操作符==(constsquare&that){return(that.side==this->side);} }; int main(int argc,char*argv[]) { 广场1(10); 广场2号(20); 广场3(20);
//为什么squre的构造函数会将参数设置为0?你打算如何处理构造函数中的
呢?你从来没有将s=0;
设置为任何值。仅仅打印这些值就会显示出一些可疑的东西。你在试着调试它时并没有完全自杀……重载运算符的意义在于它是一个错误允许您以正常方式使用这些运算符;side
(并且相等运算符应返回一个sq1==sq2
,不打印任何内容;bool
)谢谢,我还是个新手,我已经感觉很棒了dumb@ahrnad不必感到哑巴,但要给自己找一本好书。我推荐专业C++(),而不是我的否决,但我认为这是因为你回答了一个懒惰的问题(懒惰)意味着它没有调试工作。,这对某些人来说是一个拒绝投票的正当理由。我也被这一点咬了一口。此外,前3条评论已经发现了问题,当你发布你的评论时,已经有2条答案了,并且OP已经说了“谢谢”对其中一人,他随后接受了。不欢迎迟交的答案没有添加任何新内容。在这种情况下,我不会投反对票,但我也不会投反对票,即使答案是正确的(确实如此)。当然,你的代表性很高,所以所有这些对你来说都不应该是新闻。老实说,我很惊讶看到你的答案,考虑到这一切。@FabioTurati:答案不会出现在评论部分。当答案只出现在评论部分时,我绝对会写一个答案。如果评论作者对此感到不安,他们应该这样做把答案写在正确的地方。除了我的答案之外,唯一一个真正确定问题的答案是在我的答案之后发布的。因此,总之,我的答案是第一个真正回答问题的答案。如果这不是“添加新内容”,那又是什么呢?在这个基础上投反对票是荒谬的。@FabioTurati:同样,以“你应该知道得更好”为基础为你的论点辩护假设你实际上是对的,这是一种居高临下的态度……特别是当有理由不同意你的观点时(如上所述)。谢谢。我们似乎不同意Pierre和LinkedRom的答案的价值。没错,他们没有提到错误是由于未初始化的变量造成的,正如你指出的。但是你就停在那里了。如果只有你的答案,OP可能会问他们为什么未初始化,这是其他人解释的:构造函数是错误的。你的批准ach更具教学性,向他展示了调查的方法;他们的方法更实用,给出了完整的解决方案。当我说你没有添加任何内容时,我的意思是,如果OP理解他们的解决方案,他也可以推断出其余的内容。仅此而已,没有冒犯之意。返回边==s1.side;
#include <iostream> using namespace std; class square { int side; public: square(int s = 0) : side(s){} // operator int() { return side; } // OR (for this use case) bool operator==( const square& that ){ return ( that.side == this->side ); } }; int main(int argc, char* argv[] ) { square sq1(10); square sq2(20); square sq3(20); // cout << (sq1.operator==(sq2)?"true":"false"); // cout << (sq2.operator==(sq3)?"true":"false"); // No need to explicitly call operator==, the comparison is inferred cout << (sq1 == sq2 ? "true" : "false") << endl; cout << (sq2 == sq3 ? "true" : "false") << endl;; }