我在变量上收到 3 个 C4703 错误我认为我已经正确初始化但我不确定我遗漏了什么
I'm getting 3 C4703 errors on variables I think I've initialized correctly and I'm not sure what I'm missing
我正在为 class 编写一个项目,我必须让我的程序从输入文件中读取算术表达式并对其求值。不幸的是,每当我尝试实现我的 ternaryCondition.h header 时,我的调试都会抛出三个
subexpression.cpp(75):error C4703: potentially uninitialized local pointer variable 'first' used
subexpression.cpp(75):error C4703: potentially uninitialized local pointer variable 'second' used
subexpression.cpp(75):error C4703: potentially uninitialized local pointer variable 'third' used
这是我第二次使用 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 header 以防可能导致问题:
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 HEADER 文件:
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;
};
创建自己的解析器值得称赞。它将帮助您更好地理解编译器的工作原理。
您的错误似乎是在以下行触发的
return new TernaryCondition(first, second, third);
虽然从逻辑上讲,如果 istertiary 为真,那么 first、second 和 third 应该已经初始化了。编译器要么感到困惑,要么第 75 行在其他地方。如果编译器感到困惑,那是因为初始化发生在条件块中,所以它可能永远不会发生。然后在您尝试使用变量之后,至少在不检查逻辑依赖性的情况下,可能未初始化
您应该初始化 SubExpression
class 的所有成员,而不是让它们处于不一致、未初始化的状态。
初始化应该是这样的:
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()
语句为真来设置上面的指针。不要那样做——同样的事情适用于你的 class 成员——将所有这些变量初始化为 nullptr
.
first
、second
和 third
都是 class 成员和 parse()
中的局部变量。前者确实是未初始化的,除非 operation == ':'。在没有 this->
的情况下使用时,编译器会选择本地的。
名称冲突,仅此而已。
我正在为 class 编写一个项目,我必须让我的程序从输入文件中读取算术表达式并对其求值。不幸的是,每当我尝试实现我的 ternaryCondition.h header 时,我的调试都会抛出三个
subexpression.cpp(75):error C4703: potentially uninitialized local pointer variable 'first' used
subexpression.cpp(75):error C4703: potentially uninitialized local pointer variable 'second' used
subexpression.cpp(75):error C4703: potentially uninitialized local pointer variable 'third' used
这是我第二次使用 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 header 以防可能导致问题:
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 HEADER 文件:
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;
};
创建自己的解析器值得称赞。它将帮助您更好地理解编译器的工作原理。
您的错误似乎是在以下行触发的
return new TernaryCondition(first, second, third);
虽然从逻辑上讲,如果 istertiary 为真,那么 first、second 和 third 应该已经初始化了。编译器要么感到困惑,要么第 75 行在其他地方。如果编译器感到困惑,那是因为初始化发生在条件块中,所以它可能永远不会发生。然后在您尝试使用变量之后,至少在不检查逻辑依赖性的情况下,可能未初始化
您应该初始化 SubExpression
class 的所有成员,而不是让它们处于不一致、未初始化的状态。
初始化应该是这样的:
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()
语句为真来设置上面的指针。不要那样做——同样的事情适用于你的 class 成员——将所有这些变量初始化为 nullptr
.
first
、second
和 third
都是 class 成员和 parse()
中的局部变量。前者确实是未初始化的,除非 operation == ':'。在没有 this->
的情况下使用时,编译器会选择本地的。
名称冲突,仅此而已。