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

MyFirstClassMySecondClassが継承によって関連付けられている場合は、@unkulunkulu の回答で提案されていることを実行できます。

ただし、MyFirstClassMySecondClass無関係なクラスの場合、テンプレートを次のように使用できます。

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

wheredo_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 に答える
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 に答える
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++ は、この行の静的型付け言語です。

    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実際には、適切な設計 (共通メソッドを基本クラスに移動) により、おそらくこのステートメントは完全に不要になります。これはポリモーフィズムと呼ばれるものであり、その全体的な目的は、これらのiforswitchステートメントの必要性を排除することです。

于 2012-06-26T12:36:35.607 に答える
1

以下はうまくいくはずです。C++ では、変数のスコープはブラケット { } 内にあります。つまり、ブラケット内でのみ認識されます。あなたが抜け出すと、プログラムはそれについて何も知りません。

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

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

ポリモーフィックでない可能性がある場合main、正しい解決策のように見えるのはファンクター (または関数オブジェクト) です。boost functionboost bindは、これらのライブラリを提供します。

以下のプログラムのメモリ リークを無視して、オブジェクトnew A()またはnew B()をそれぞれGetNum()の呼び出しにバインドし、それらを呼び出し可能なオブジェクト にラップしますf。必要に応じて電話f()します。

#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 に答える