我在创建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'
答案 0 :(得分: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文件,你可以在头文件中定义成员函数,但是在类定义之后使用{{1关键字:
inline
当您不希望类的接口难以阅读但仍希望能够不使用.cpp文件时,这非常有用。但是,请注意,当您构建包含多个不同文件中的标头的项目时,不使用.cpp文件会增加编译时间,并且如果您在实现中做出最微小的更改,也会触发所有这些文件的重建。该头文件中的成员函数。因此,在每个类中都有一个.cpp文件是一个好主意,因为你可以自由编辑它而不会触发包含标题的每个其他源文件的重建。
答案 1 :(得分:0)
您的标题应如下所示
#ifndef CLASS_World
#define CLASS_World
class World
{
private:
int m_nValue;
public:
World()
int World(int value)
#endif