-1

在我的主类中,我有一个 person 对象,在 person 类中,它包含一个指向 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 是我的基类。但是,它稍后会在我的主源文件中抱怨初始化。我不知道这个初始化问题是怎么回事。我也不能将指针指向一个虚假的 Strategy 对象。

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

4

1 回答 1

2

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

也就是说,这尖叫声???

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

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

使 StrategyType 成为 Person 的值属性,并像这样初始化它:

person.strategy.setStrategyType(strategyType);

或者更好的是这样:

class Person
{
   ...
   StrategyType strategy;

public:
   void setStrategyType(StrategyType type)
   {
       strategyType.setStrategyType(type);
   }
};
于 2012-11-17T08:18:21.987 回答