1

我不了解 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布尔值。
请问我该如何解决?

4

6 回答 6

3

如何在 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 语句中定义了它,在它之后,该变量已经超出范围并且无法再被引用。

于 2012-06-26T12:33:39.760 回答
3

如果MyFirstClass并且MySecondClass通过继承相关,那么您可以按照@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....
}

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

于 2012-06-26T12:39:18.410 回答
2

在循环中分配 i 的值。

int i;
if (!fModeMdi){
        MyFirstClass* main = (MyFirstClass*) fMaino;
        i = main->GetNum();
}else{
        MySecondClass* main = (MySecondClass*) fMdio;
        i = main->GetNum();
}
于 2012-06-26T12:39:13.607 回答
1

以下应该工作。在 c++ 中,变量的范围在括号 {} 内,即只能在括号内识别。一旦你出去,程序就不知道了。

MyFirstClass* main =0; 
MySecondClass* main2 =0; 

if (!fModeMdi)
            main = (MyFirstClass*) fMaino;
    else
            main2 = (MySecondClass*) fMdio;
于 2012-06-26T12:34:57.947 回答
1

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

    int i = main->GetNum();

编译器必须在编译时知道 的类型main(静态,因此得名)。您不能使 type ofmain依赖于某些 value 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语句的需要。

于 2012-06-26T12:36:35.607 回答
0

If main may not be polymorphic, then what appears to be the right solution is a functor (or function object). boost function and boost bind provide these libraries.

Ignoring the memory leak in the below program, we bind the object new A() or new B() to their respective GetNum() calls and wrap them in a callable object, f. We call f() when needed.

#include <boost/function.hpp>
#include <boost/bind.hpp>
#include <iostream>

class A {
     public:
    int GetNum() { return 0; }
};

class B {
    public:
    int GetNum() { return 0; }
};

int main(int args, char** argv)
{

    bool p = true;
    boost::function<int()> f;
    int i;

    if ( p ) {
        f = boost::bind(&A::GetNum, new A());
    }
    else {
        f = boost::bind(&B::GetNum, new B());
    }

    i = f();

    std::cout<<i<<std::endl;

    return 0;
}
于 2012-06-26T13:06:45.460 回答