如何解决在if / else if分支之后使用未声明的标识符
P* pFactory(const std::string& pName){
if (p == "s")
SP newP;
else if(pName == "f")
FP newP;
else if(pName == "l")
LP newP;
else if(pName == "i")
IP newP;
else if(pName == "g")
GP newP;
else if (pName == "n")
NP newP;
P* p_ptr = &newP;
return nullptr;
}
基本上,该函数应该返回一个指向新的P对象的指针,该对象取决于pName输入。我在指针行上遇到了使用未声明的标识符'newP'的错误。
我认为可能是因为没有其他终结符,所以可能永远不会创建该对象,但是如果用else替换最后一个对象没有帮助。是什么导致此错误?
编辑:
P* newP = nullptr;
if (pName== "s")
newP = new SP;
else if(pName == "f")
newP = new FP;
else if(pName == "l")
newP = new LP;
else if(pName == "i")
newP = new IP;
else if(pName == "g")
newP = new GP;
else if (pName == "n")
newP = new NP;
return newP;
这项工作吗?
解决方法
If-else,语句具有自己的范围,因此您无法访问其中指定的变量。在if-else块上方声明变量,然后在if-else内部分配值。
此外,获取堆栈创建的对象的引用并返回它是您最糟糕的事情,因为在函数退出创建悬空指针之后,该变量将超出范围。
您可以利用智能指针为您完成内存管理。
下面是一个示例:
#include <string>
#include <memory>
struct P {};
struct A : public P {};
struct B : public P {};
struct C : public P {};
std::unique_ptr<P> pFactory(const std::string& pName)
{
std::unique_ptr<P> p_ptr;
if (pName == "s")
p_ptr = std::make_unique<A>();
else if (pName == "f")
p_ptr = std::make_unique<B>();
else if (pName == "l")
p_ptr = std::make_unique<C>();
return p_ptr;
}
int main()
{
const auto fFactory = pFactory("f");
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。