我正在为一个类编写一个项目,我必须让我的程序从输入文件中读取算术表达式并对其求值。不幸的是,每当我尝试实现ternaryCondition.h标头时,我的调试都会抛出三个
subexpression.cpp(75):错误C4703:使用了可能未初始化的本地指针变量'first'
subexpression.cpp(75):错误C4703:使用了可能未初始化的本地指针变量'second'
subexpression.cpp(75):错误C4703:使用了可能未初始化的本地指针变量“ third”
这是我第二次使用C ++,所以我觉得我完全失去了一些东西。
我尝试禁用/ sdl检查,但是当我这样做时,发现我的程序无法再逐行读取输入文件并评估表达式了。
这是subexpressions.cpp,它会将错误抛出到发生错误的第75行:
#include <iostream>
using namespace std;
#include "expression.h"
#include "subexpression.h"
#include "operand.h"
#include "plus.h"
#include "minus.h"
#include "times.h"
#include "divide.h"
#include "greaterThan.h"
#include "lessThan.h"
#include "equal.h"
#include "and.h"
#include "or.h"
#include "negation.h"
#include "ternaryCondition.h"
#include <sstream>
SubExpression::SubExpression(Expression* left, Expression* right)
{
this->left = left;
this->right = right;
}
SubExpression::SubExpression(Expression* first, Expression* second, Expression* third)
{
this->first = first;
this->second = second;
this->third = third;
}
SubExpression::SubExpression(Expression* left)
{
this->left = left;
}
Expression* SubExpression::parse(stringstream& in)
{
Expression* left;
Expression* right;
Expression* first;
Expression* second;
Expression* third;
char operation, paren;
bool isTernary = false;
left = Operand::parse(in);
cin >> operation;
right = Operand::parse(in);
if (operation == ':')
{
first = left;
second = right;
left = Operand::parse(in);
cin >> operation;
right = Operand::parse(in);
if (operation == '?')
{
third = right;
isTernary = true;
}
}
cin >> paren;
if (isTernary == true)
{
return new TernaryCondition(first, second, third);
//THE LINE ABOVE IS LINE 75 WHERE THE ERROR IS BEING THROWN
}
switch (operation)
{
这是ternaryCondition.h标头,以防引起问题:
class TernaryCondition : public SubExpression
{
public:
TernaryCondition(Expression* first, Expression* second, Expression* third) :
SubExpression(first, second, third)
{
}
int evaluate()
{
return third->evaluate() ? first->evaluate() : second->evaluate();
}
};
这部分代码的目的是使程序可以计算
之类的表达式((((z <(50 + aa))&(bb!))*((3 / cc)|(1:0?(z> aa)),z = 4,aa = 2,bb = 4,cc = 2;
很抱歉,如果我以不正确的格式提交了此信息,这是我第一次发布。
添加了subexpression.h头文件:
class SubExpression : public Expression
{
public:
SubExpression(Expression* left, Expression* right);
SubExpression(Expression* left);
SubExpression(Expression* first, Expression* second, Expression* third);
static Expression* parse(stringstream& in);
protected:
Expression* left;
Expression* right;
Expression* first;
Expression* second;
Expression* third;
};
答案 0 :(得分:0)
创建自己的解析器值得称赞。它将帮助您更好地了解编译器的工作方式。
在这里,您的错误似乎在下一行触发了
((B) a).b
从逻辑上讲,如果餐厅为true,则应该已经初始化第一,第二和第三。编译器会感到困惑,或者#75行在其他地方。如果编译器感到困惑,那是因为初始化发生在条件块内,所以它可能永远不会发生。然后,在尝试使用变量之后,至少在不检查逻辑依赖关系的情况下,这些变量可能会被初始化
答案 1 :(得分:0)
您应该初始化SubExpression
类的所有成员,并且不要让它们处于不一致的未初始化状态。
这是初始化的样子:
class SubExpression : public Expression
{
public:
SubExpression(Expression* left, Expression* right);
SubExpression(Expression* left);
SubExpression(Expression* first, Expression* second, Expression* third);
static Expression* parse(stringstream& in);
protected:
Expression* left;
Expression* right;
Expression* first;
Expression* second;
Expression* third;
};
SubExpression::Subexpression(Expression* left_, Expression* right_) : left(left_), right(right_), first(nullptr), second(nullptr), third(nullptr)
{}
SubExpression::Subexpression(Expression* left_) : left(left_), right(nullptr), first(nullptr), second(nullptr), third(nullptr)
{}
SubExpression::Subexpression(Expression* first_, Expression* second_, Expression* third_) : left(nullptr), right(nullptr), first(first_), second(second_), third(third_)
{}
第二,由于指针未初始化,因此调试使用这些未初始化值之一的程序将更加困难。如果至少将指针设置为nullptr
,则有更好的机会修复所有错误。
警告的另一个潜在原因是parse
函数中的以下代码:
Expression* left;
Expression* right;
Expression* first;
Expression* second;
Expression* third;
在parse
函数中,您依靠if()
语句为true来设置上面的指针。请勿这样做-适用于您的类成员的适用于此-将所有这些变量都初始化为nullptr
。
答案 2 :(得分:0)
first
,second
和third
都是类成员,并且是parse()
中的局部变量。除非操作==':',否则前者确实未初始化。在不使用this->
的情况下,编译器会选择本地的。
仅此而已。