在我的主课堂上,我有一个人物,在人类中, 包含指向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(),我会得到我想要的值。
答案 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);
}
};