0

我在创建 Hello World 的 OOP 版本时遇到问题。如何将 World 对象定义添加到我的标题中?

主要.cpp:

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

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

世界.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;
    }
};

世界.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(并按照之前的建议添加包含保护。)

最后,还有第三种方法可以做到这一点,它也只需要一个头文件而没有 .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 回答