指针未初始化?

时间:2012-11-17 07:03:00

标签: c++ pointers initialization

在我的主课堂上,我有一个人物,在人类中, 包含指向Strategy对象的指针。我正在尝试这样做:

person.strategyPointer->getStrategyType()

但是当我打印出来时,我得到一个特殊的号码,3435973836。这个 可能意味着我的strategyPointer尚未初始化。

在我的Person类头文件中,我声明了这个:

Strategy* strategyPointer;

在Person.cpp文件中,我像这样初始化指针。

Person::Person()
    : strategyPointer(nullptr)
{
}

如果我将指针指向null,为什么编译器仍然抱怨 我没有初始化strategyPointer?或者也许是因为它指出 为null,它超出范围并被删除?我实际上指的是 我解析时指向某事的指针。我做这样的事情:

StrategyType newStrat;
newStrat.setStrategyType(strategyType);
    person.strategyPointer = &newStrat

我正在使用继承,而Strategy是我的基类。然而,它抱怨 稍后在我的主源文件中初始化。我不知道是什么 继续这个初始化问题。我无法将指针指向a 伪造战略对象。

编辑: 我刚刚在Person头文件中添加了一个新的变量声明, 战略新战略; 我稍后将我创建的StrategyType对象分配给newStrategy,并将strategyPointer指向& newStrategy。这应该可以防止我创建的StrategyType对象超出范围,对吧?但是在我的main.cpp中,当我尝试打印出person.stratPointer-> getStrategyType()时,我仍然得到相同的值。但是,如果我打印出person.newStrategy.getStrategyType(),我会得到我想要的值。

1 个答案:

答案 0 :(得分:1)

除非您打算取消引用NULL指针(如果是,请检查您的头部),“初始化”的定义仅在初始化程序中将指针设置为nullptr的意义上是准确的。 Person构造函数的列表,避免其值不确定。

那说,这是???的尖叫声。

StrategyType newStrat;
newStrat.setStrategyType(strategyType);
person.strategyPointer = &newStrat;

如果这是某个函数(当然必须是),那么newStrat超出函数返回,循环退出等范围的那一刻,你的person对象现在引用了未定义的行为。它还可以解释为什么您将堆栈标记视为结果值。

使StrategyType成为Person的value-property并将其初始化为:

person.strategy.setStrategyType(strategyType);

或者更好的是:

class Person
{
   ...
   StrategyType strategy;

public:
   void setStrategyType(StrategyType type)
   {
       strategyType.setStrategyType(type);
   }
};