0

Hello World の OOP バージョンの作成に問題があります。World オブジェクト定義をヘッダーに追加するにはどうすればよいですか?

Main.cpp:

#include "stdafx.h"
#include "World.h"
#include <iostream>

int main() {
    World world;
    World world2(5);
    std::cin.get();
    return 0;
}

World.cpp:

#include "stdafx.h"
#include <iostream>

class World {
public:
    World() {
        std::cout << "Hello World!" << std::endl;
    }

    World(int test) {
        std::cout << "Hello World!" << std::endl;
    }

    ~World() {
        std::cout << "Good Bye!" << std::endl;
    }
};

World.h:

class World;
class World(int);

エラー:

1>d:\programming\c++\consoleapplication1\consoleapplication1\world.h(2): error C2062: type 'int' unexpected
1>d:\programming\c++\consoleapplication1\consoleapplication1\main.cpp(6): error C2079: 'world' uses undefined class 'World'
1>d:\programming\c++\consoleapplication1\consoleapplication1\main.cpp(7): error C2079: 'world2' uses undefined class 'World'
4

2 に答える 2

5

ヘッダー ファイルでクラスを定義します。他のいくつかのファイルに同じヘッダーが含まれている場合の問題を回避するために、 include guardも必ず使用する必要があります(現在の例では問題ではありませんが、それでも非常に良い方法です):

// This is the include guard.
#ifndef WORLD_H
#define WORLD_H

class World {
public:
    World();
    World(int test);
    ~World();
};

#endif

そして、cpp ファイルでそのクラスのメンバー関数を定義します。

#include "World.h"
#include <iostream>

World::World()
{
    std::cout << "Hello World!" << std::endl;
}

World::World(int test)
{
    std::cout << "Hello World!" << std::endl;
}

World::~World()
{
    std::cout << "Good Bye!" << std::endl;
}

ただし、必要に応じて、クラスとメンバー関数の両方をヘッダー ファイルで直接定義することもできます。その場合、クラスの .cpp ファイルはまったく必要ありません。これを行うには、現在の World.h ヘッダーを削除し、World.cpp の名前を World.h に変更します (前述のように、インクルード ガードを追加します)。

最後に、これを行うことができる 3 番目の方法があります。これもヘッダー ファイルのみが必要で、.cpp ファイルは必要ありません。ヘッダー内でメンバー関数を定義しますが、ifinlineキーワードを使用してクラス定義の後に定義します。

#ifndef WORLD_H
#define WORLD_H

#include <iostream>

class World {
public:
    World();
    World(int test);
    ~World();
};

inline World::World()
{
    std::cout << "Hello World!" << std::endl;
}

inline World::World(int test)
{
    std::cout << "Hello World!" << std::endl;
}

inline World::~World()
{
    std::cout << "Good Bye!" << std::endl;
}

#endif

これは、クラスのインターフェイスを読みにくくしたくないが、.cpp ファイルがなくてもできるようにしたい場合に便利です。ただし、.cpp ファイルを使用しないと、いくつかの異なるファイルにヘッダーを含むプロジェクトをビルドするときにコンパイル時間が長くなる可能性があることに注意してください。そのヘッダー ファイルのメンバー関数。このため、ほとんどの場合、クラスごとに .cpp ファイルを用意することをお勧めします。これは、ヘッダーを含む他のすべてのソース ファイルの再構築をトリガーすることなく自由に編集できるためです。

于 2013-06-09T18:00:50.550 に答える
0

ヘッダーは次のようになります

#ifndef CLASS_World
#define CLASS_World
class World
{
private:
    int m_nValue;

public:
    World()
    int World(int value) 

#endif
于 2013-06-09T17:51:39.853 に答える