3

C++ のビデオ チュートリアルをいくつか見ていますが、関数やクラスを使用または呼び出す前に定義する必要があることを知っています。しかし、私は main() 関数を一番上に置き、それ以外はすべて main 関数の下に置くのが好きです。メイン関数の下に関数を定義する場合、使用する前に宣言する必要があることはわかっていますが、クラスはどうですか? メイン関数の下でクラスを使用するには、メイン関数の上に何を置く必要がありますか。

#include <iostream>
using namespace std;

int main()
{
    ClassOne one;
    one.coolSaying();
    return 0;
}

class ClassOne
{
    public:
        void coolSaying()
        {
            cout << "Cool stuff yo!" << endl;
        }
};

これを main() の直前に配置して、クラスを定義しようとしました。

class ClassOne;

しかし、うまくいきません。

4

5 に答える 5

7

これが、ヘッダー ファイルが通常 C++ で使用される理由です。あなたが言っているときClassOne one、コンパイラはその型のオブジェクトを作成するためにクラスがどのように見えるかを知る必要があります. クラスがどこかに存在することを知るだけでは十分ではありません (ポインタだけが必要な場合はこれで十分です)。そのため、コンパイラはすでにクラスの定義を読み取っている必要があります。

クラスは、最初に使用する前に定義する必要があります。の前に明示的に配置せずにmain、通常の方法はヘッダー ファイルを作成することです。したがってClassOne.h、クラス宣言で作成すると、#include "ClassOne.hファイルの先頭になります。この状況では、クラスの実際のメソッドは通常、別のソース ファイルClassOne.cpp.

于 2013-08-04T18:15:45.963 に答える
1

(注:他のすべての回答は正しいですが、これが役立つ場合があります)

mainおよび二次関数クラスの順序を逆にするこのイディオムを発見しました。私は同僚と小さなコードを共有していましたが、誰もがコードのコア (つまりmain) が一番上にあることを期待しているので、すばやく編集できます。もちろん、クラスと関数(宣言の必要なし)で動作します。#includeほとんどの場合、プリアンブル (最初の s) にはガードが含まれているため、通常はプリアンブル (最初の s) を残すことができます。

#include <iostream>
using namespace std;

#ifdef please_see_definitions_below_main
int main()
{
    ClassOne one;
    one.coolSaying();
    return 0;
}
#else
class ClassOne
{
    public:
        void coolSaying()
        {
            cout << "Cool stuff yo!" << endl;
        }
};
#define please_see_definitions_below_main
#include __FILE__
#endif

コメントとしても機能するようにタグを使用してplease_see_definitions_below_mainいますが、それが気に入らない場合は、AFTER.

于 2013-10-02T07:53:52.607 に答える
1

main() 関数の後のクラス定義が理にかなっている 1 つのシナリオ:

#include <iostream>
using namespace std;

void f();

int main()
{
    f();
    return 0;
}

class ClassOne
{
    public:
        void coolSaying()
        {
            cout << "Cool stuff yo!" << endl;
        }
};

void f()
{
    ClassOne one;
    one.coolSaying();
}
于 2013-08-04T18:43:23.703 に答える
0

サイズがわからないため、型が完全に定義されるまで、型 (変数、値メンバー) の実際のインスタンスを作成することはできません。これを回避する方法はありませんが、不完全な型へのポインタでできることはすでにたくさんあります。

于 2013-08-04T18:32:17.733 に答える