C++ : 在 if/else 中声明 : var 未在此范围内声明



我不明白C++中的某些内容,gcc 不喜欢我如何进行。
我做了:

    if (!fModeMdi)
            MyFirstClass* main = (MyFirstClass*) fMaino;
    else
            MySecondClass* main = (MySecondClass*) fMdio;
    ...
    ...
    int i = main->GetNum();

我收到此错误:

file.C:211:16: warning: unused variable 'main' [-Wunused-variable]
file.C:213:15: warning: unused variable 'main' [-Wunused-variable]
file.C:219:9: error: 'main' was not declared in this scope

我无法在我的标头中声明main,因为他的类型取决于布尔值fModeMdi
请问我该如何解决这个问题?

如果MyFirstClassMySecondClass通过继承相关联,那么你可以按照@unkulunkulu在他的回答中建议的那样做。

但是,如果MyFirstClassMySecondClass是不相关的类,则可以将模板用作:

if (!fModeMdi)
{
    do_work(static_cast<MyFirstClass*>(fMaino));
}
else
{
    do_work(static_cast<MySecondClass*>(fMaino));
}

其中do_work是一个函数模板,实现为:

template<typename T>
void do_work(T *obj)
{
    int i = obj->GetNum();
    //do rest of the work here....
}

请注意,即使它们是相关的,此模板解决方案也可以工作!!

在 if 语句之前定义变量,并在其中赋值它怎么样?

MyFirstClass* main = 0; // use nullptr if you have access to a C++11 compiler
if (!fModeMdi)
    main = (MyFirstClass*) fMaino;
else
    main = (MySecondClass*) fMdio;

由于您在 if 语句中定义了它,因此在它之后,变量已经超出了范围,无法再引用。

在循环中分配 i 的值。

int i;
if (!fModeMdi){
        MyFirstClass* main = (MyFirstClass*) fMaino;
        i = main->GetNum();
}else{
        MySecondClass* main = (MySecondClass*) fMdio;
        i = main->GetNum();
}

以下内容应该有效。在 c++ 中,变量的作用域在括号 { } 内,也就是说,它只在括号内被识别。一旦你出去,程序就不知道了。

MyFirstClass* main =0; 
MySecondClass* main2 =0; 
if (!fModeMdi)
            main = (MyFirstClass*) fMaino;
    else
            main2 = (MySecondClass*) fMdio;

C++ 是一种静态类型的语言,在此行

    int i = main->GetNum();

编译器必须在编译时知道main的类型(静态,因此得名)。你不能使main的类型依赖于某个值fModeMdi,这只在运行时是已知的。如果每个类都包含一个方法 GetNum 和其他类(在 if 语句之后使用),则可以考虑将它们移动到基类中,如下所示:

class MyBaseClass {
public:
    virtual int GetNum() = 0;
}
class MyFirstClass : public MyBaseClass {
    // ...
};

class MySecondClass : public MyBaseClass {
    // ...
};
MyBaseClass* main = 0;
if (!fModeMdi)
            main = (MyFirstClass*) fMaino;
    else
            main = (MySecondClass*) fMdio;
    ...
    ...

然后这是合法的

    int i = main->GetNum();

实际上,正确的设计(将常用方法移动到基类)可能会完全消除对这个if语句的需求。这就是所谓的多态性,它的全部目的是消除对这些ifswitch语句的需求。

最新更新