首页 > 解决方案 > 在 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;

这行得通吗?

标签: c++if-statementidentifier

解决方案


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");
}

居住


推荐阅读