-1

クラス/オブジェクトの使用は初めてです。私はこのようなものを書こうとしています:

class C1{

    main ()
    {
         C2::foo();
    }
};

class C2:public C1
{
public:
    foo()
    {
    }
};

C2::foo() が呼び出されると、コンパイラは C2 がクラスまたは名前空間ではないと不平を言います。クラス C2 の定義を前に移動すると、C1 は定義されません。ここで何ができるでしょうか?

4

4 に答える 4

2

という名前のメンバー関数を使用してクラスを作成できますが、プログラムを開始するために呼び出されるのはmainではありません。グローバル関数である必要があります (クラスまたは名前空間の外部)。しかし、はい、名前付きのメンバー関数はまったく問題ありません (§3.6.1/3): mainmain

名前mainは予約されていません。[main:他の名前空間のエンティティと同様に、メンバー関数、クラス、および列挙を呼び出すことができます。--終了例

コードをどのように配置するかに関しては、通常、次のような結果になります。

class C1 { 
    int main();
};

class C2 : public C1 { 
public:
    int foo();
    // or perhaps: static int foo();
};

int C1::main() {
    C2::foo(); // given `C2::static int foo();`
    // otherwise: C2 c; c.foo();
}
于 2013-02-26T04:54:40.063 に答える
1

main は、クラス内にあるべきではありません。

于 2013-02-26T04:49:10.760 に答える
1

いいえ、mainクラス内にいることはできません。(明確にするためmainに、クラスで関数を呼び出すことはできますが、それらはプログラムのエントリ ポイントにはなりません。)

(C++ 標準 n3337、セクション 3.6.1)

プログラムには、プログラムの指定された開始であると呼ばれるグローバル関数が含まれます。main

于 2013-02-26T04:49:11.320 に答える
1

aはクラス内に存在main できます。mainしかし、グローバルでなければならないentry point と同じではありません!

次に例を示します。

#include <iostream>

using namespace std;

class C2 {
   public:
     void foo() {
        cout << "Foo!";
    }
};

class C1 {
   public:
     void main() { // not the same as the entry-point `main`
       cout << "What?";
       b.foo();
     }
  private: 
     B b;
};



int main() //actual entry point `main`
{
   A a;
   a.main();
   return 0;
}

ただし、コードには重大な欠陥があることに注意してください。たとえば、メンバー関数には戻り値の型が必要voidです(何も返さない場合)。次に、fooはオブジェクト関数です。これは、 type のオブジェクトでのみ呼び出すことができることを意味しますC2

于 2013-02-26T04:55:38.347 に答える