我在变量上收到 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
我正在编写一个课程的项目,我必须让我的程序从输入文件中读取算术表达式并对其进行评估。不幸的是,每当我尝试实现我的ternarycondition。
subexpression.cpp(75(:错误c4703:潜在的非初始化的本地指针变量'first'使用
subexpression.cpp(75(:错误c4703:潜在的非初始化的本地指针变量'second'使用
subexpression.cpp(75(:错误c4703:潜在的非初始化的本地指针变量"第三"使用
这是我第二次使用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&lt;(50 aa(((&amp;(bb!(( *((3/cc(|(1:0?(z&gt; aa((,z = 4,aa = 2,bb = 4,cc = 2;
我很抱歉,如果我以不当格式提交了此内容,这是我第一次发布。
添加了subxpression.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;
};
您应该初始化 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()
语句为真实设置上述指针。不要这样做 - 这里适用于您的类成员的同样的事情 - 将所有这些变量初始化为nullptr
。
创建自己的解析器是值得称赞的。它将帮助您更好地了解编译器的工作方式。
这里似乎在以下行触发了您的错误
return new TernaryCondition(first, second, third);
从逻辑上讲,如果 ISTERTIARY 是正确的,则应该已经初始化首先,第二,第二和第三个。要么合适的人会感到困惑,要么第75行在其他地方。如果符合者感到困惑,那是因为初始化发生在有条件的块中,因此它可能永远不会发生。然后,在尝试使用变量时,至少在不检查逻辑依赖性的情况下可能是非初始化的
first
, second
和 third
既是parse()
中的类成员和本地变量。除非操作==':',否则前者的确是非初始化的。当没有this->
使用时,编译器会选择本地。
名称碰撞,仅此而已。
- 未初始化的变量有什么危险
- 初始化或分配空字符串文字到指向 C 中的 char 的指针或指向 C++ 中 const char 的指针的原因是什么
- 不同的类或结构初始化方法之间的性能差异是什么?
- 初始化数组、"memset"或" {//value} "的最佳方法是什么?
- C++ 未初始化的本地(非全局)int 数组中的元素类型到底是什么?
- 静态初始化的反义词是什么?
- 它解决了什么问题,对于非真空初始化,生命周期在初始化之前就开始了
- 初始化不是整数的巨大常量多维数组的最佳方法是什么?
- 使用 const char* 初始化 const ref 字符串成员时幕后会发生什么
- 初始化类成员的更好做法是什么?
- C++初始化的结果是什么?
- 如果在 C++ 构造函数中以错误的顺序初始化对象数据,会发生什么类型的错误
- 这些初始化之间有什么区别?
- 初始化对象以在 C++08 中作为参数传递的首选语法是什么?
- 构造函数中没有参数的对象类成员按什么顺序初始化?
- 两种初始化有什么区别:Foo f();Foo f = Foo()
- 在多个对象中初始化预定义成员变量的正确方法是什么?
- 统一初始化是隐式发生的,即使 int 强制转换运算符是使用 explicit 关键字声明的.原因是什么?
- 在C++中初始化带有和不使用构造函数调用的对象有什么区别
- C++11 大括号/聚合初始化.什么时候使用它?