C++ 为什么我的情况不起作用?

C++ 为什么我的情况不起作用?,c++,function,math,output,C++,Function,Math,Output,我有以下代码: #include <iostream> using namespace std; int a, b, sqr; const int P = 3.14; //Later for circles... string s1; class MathsFunctions{ public: virtual void square(int a, int b)=0; }; class TriangleFunc: public MathsFunctions{ public:

我有以下代码:

#include <iostream>

using namespace std;

int a, b, sqr;
const int P = 3.14; //Later for circles...
string s1; 

class MathsFunctions{
public:
virtual void square(int a, int b)=0;

};

class TriangleFunc: public MathsFunctions{
public:
    void square(int a, int b){
    sqr = (a * b)/2;
    cout << "Square of triangle is: "<< sqr << endl;
    }
};

class RectangleFunc: public MathsFunctions{
public:
    void square(int a, int b){
    sqr = a * b;
    cout << "Square of rectangle is:  "<< sqr << endl;
    }
};

void getNumbers(){
 cout << "Enter the first number:  "<<endl;
 cin >> a;
 cout << "Enter the second number:   "<< endl;
 cin >> b;
}
void chooseTheFigure(){
   cout << "Choose the figure (rectangle or triangle): "<< endl;
   cin >> s1;
}

int main(){

chooseTheFigure();
getNumbers();

if(s1 == "rectangle" || "Rectangle"){
RectangleFunc r;
MathsFunctions * m = &r;
m -> square(a,b);
};

if (s1 == "triangle" || "Triangle"){
    TriangleFunc t;
    MathsFunctions *m = &t;
    m -> square(a,b);
};

}
我创建了一个计算矩形或三角形的平方的程序。主程序中有一个条件,但最终程序显示了两个结果。我该如何改进呢

程序输出的屏幕截图:


这与您认为的不同:

if(s1 == "rectangle" || "Rectangle"){
    RectangleFunc r;
    MathsFunctions * m = &r;
    m -> square(a,b);
};
上面的if表达式计算为:

if((s1 == "rectangle") || ("Rectangle"))
 // ^^^^^^^^^^^^^^^^^  or  ^^^^^^^^^^
现在,这里的第二部分,矩形是一个字符串文本,它隐式地转换为有效指针。除nullptr或类似于零的整数以外的任何指针的计算结果都是true-始终

你可能想写:

if((s1 == "rectangle") || (s1 == "Rectangle")){
    RectangleFunc r;
    MathsFunctions * m = &r;
    m -> square(a,b);
};
-------------------- 代码中还有其他一些细微差别,例如

基类中没有虚拟析构函数

这:

p将不会保持您期望的值


这与您认为的不同:

if(s1 == "rectangle" || "Rectangle"){
    RectangleFunc r;
    MathsFunctions * m = &r;
    m -> square(a,b);
};
上面的if表达式计算为:

if((s1 == "rectangle") || ("Rectangle"))
 // ^^^^^^^^^^^^^^^^^  or  ^^^^^^^^^^
现在,这里的第二部分,矩形是一个字符串文本,它隐式地转换为有效指针。除nullptr或类似于零的整数以外的任何指针的计算结果都是true-始终

你可能想写:

if((s1 == "rectangle") || (s1 == "Rectangle")){
    RectangleFunc r;
    MathsFunctions * m = &r;
    m -> square(a,b);
};
-------------------- 代码中还有其他一些细微差别,例如

基类中没有虚拟析构函数

这:

p将不会保持您期望的值


1.正如WhiZtim指出的,或操作员需要纠正

if(s1 == "rectangle" || "Rectangle") {...}
将始终为true,因为矩形不为null

您应该为字符串使用字符串比较函数,请参见strcmpi 编辑

关于字符串函数,请查看以下内容:


1.正如WhiZtim指出的,或操作员需要纠正

if(s1 == "rectangle" || "Rectangle") {...}
将始终为true,因为矩形不为null

您应该为字符串使用字符串比较函数,请参见strcmpi 编辑

关于字符串函数,请查看以下内容:

当这是真的时,有两个条件,第一个是您所期望的,第二个是您的bug,因为这是您现在在代码中想要说的:

1如果输入字符串s1与字符串文字矩形相等,则返回true,或

2如果字符串文字矩形本身被视为真值。 由于此转换本质上是一个空指针检查,并且字符串文本从不为空,因此这种情况始终为真

您需要的是重复测试:

if(s1 == "rectangle" || s1 == "Rectangle"){
当这是真的时,有两个条件,第一个是您所期望的,第二个是您的bug,因为这是您现在在代码中想要说的:

1如果输入字符串s1与字符串文字矩形相等,则返回true,或

2如果字符串文字矩形本身被视为真值。 由于此转换本质上是一个空指针检查,并且字符串文本从不为空,因此这种情况始终为真

您需要的是重复测试:

if(s1 == "rectangle" || s1 == "Rectangle"){

任何使用屏幕阅读器的人都将很难读取该输出。s1==矩形| | s1==矩形s1==三角形| | s1==Triangle@KillzoneKid谢谢你!我甚至无法想象这个错误是如此愚蠢@MichealO'Dwyer明白了!Thanks@Nikita为什么要使用要在类之间共享的全局变量?您需要学习如何使用成员变量!任何使用屏幕阅读器的人都将很难读取该输出。s1==矩形| | s1==矩形s1==三角形| | s1==Triangle@KillzoneKid谢谢你!我甚至无法想象这个错误是如此愚蠢@MichealO'Dwyer明白了!Thanks@Nikita为什么要使用要在类之间共享的全局变量?您需要学习如何使用成员变量!非常感谢你!非常感谢你!非常感谢。我明白。只是你的第二点有点问题。C++中没有标准函数,如STRCPMI。其次,如果你的意思是,对于std::string,绝对没有上帝的理由这么做。如果你需要那种风格,那就有。而且对于一些角落的箱子,它通常比strcmp快。谢谢你指出这一点。。已经失去联系一段时间了:谢谢!我明白。只是你的第二点有点问题。C++中没有标准函数,如STRCPMI。其次,如果你的意思是,对于std::string,绝对没有上帝的理由这么做。如果你需要那种风格,那就有。而且对于一些角落的箱子,它通常比strcmp快。谢谢你指出这一点。。已经失去联系一段时间了: