c++ - 在 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;
}
基本上,该函数应该返回一个指向根据 pName 输入生成的新 P 对象的指针。我在指针行上收到使用未声明的标识符“newP”错误。
我认为这可能是因为没有 final else 所以对象可能永远不会被创建,但是用 else 替换最后一个 else if 并没有帮助。是什么导致了这个错误?
编辑:
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");
}
推荐阅读
- android - 如果在 Firebase 实时数据库中删除最后一个子节点,则父节点将被删除
- windows - 脚本无法通过 Windows 10 调度程序按预期工作
- flash - 如何解决下载程序上的“组件'FLASH.OCX'或其依赖项之一未正确注册:文件丢失或无效”
- r - 为什么我的 NA 值在 R 的 ComplexHeatmap 中不起作用?
- python - 如何防止为 TableWidget 第一行上创建的每个 ComboBox 编写额外的代码行?
- c++ - C 和 C++ 中的奇怪搜索行为
- python - 多线程中的异常 - Python
- sql - 仅限 Oracle SQL:Case 语句或存在查询以根据条件显示结果
- node.js - 我在 jwt.sign() 中分配值时遇到问题
- c++ - 如何计算两个给定地理坐标和方位角之间的交点坐标