我有关于包含头文件的以下问题。我正在学习课程,并出现了以下问题:
有人告诉我,类的声明应该进入一个单独的头文件,例如
//TestClass.hpp
#include <string>
class TestClass{
private:
void init();
public:
double r;
double a;
std::string Type;
TestClass(const std::string& stringType);
};
在各自的TestClass.cpp中我正确定义了一切:
// TestClass.cpp
//
#include "TestClass.hpp"
#include <string>
#include <iostream>
void TestClass::init()
{ // Initialise all default values
// Default values
r = 0.08;
a = 0.30;
Type = "Hello";
}
TestClass::TestClass(const std::string& stringType)
{ // Create option type
init();
Type = stringType;
if (Type == "hello")
Type = "Hello";
}
如果我在头文件中包含指令<string>
,我是否必须在TestClass.cpp文件中再次包含它?
答案 0 :(得分:4)
不,您在头文件中声明的所有内容都将被拉入包含标头的任何文件中。顺便说一下,您应添加include guard / #pragma once
。
答案 1 :(得分:4)
不,你不是,但我还是会这样做,以使代码更清晰:你明确地说那么&#34;这段代码需要 {{1正常工作&#34;。如果您将来因某种原因决定不使用string
,则代码会停止编译,您必须手动解决缺少的内容。
请记住,TestClass.hpp
没有任何魔力,它只是打开您指定的文件,并用该文件的内容替换#include
。因此,您需要将文件#include
粘贴到TestClass.hpp
,但之后您需要将文件TestClass.cpp
粘贴到string
。实际上,TestClass.hpp
也会包含在string
中。
这就产生了第二个问题:你的档案中没有包含警戒。如果您TestClass.cpp
一个文件,#include
是您的#include
,您将收到编译错误。正确实现的C ++标头看起来更像是以下内容:
TestClass.hpp
这样可以确保,如果您的文件第二次被包含在内,则无法实际使用。
这也可以通过使用自动包含保护来实现:
#ifndef TESTCLASS_HPP
#define TESTCLASS_HPP
// Code
#endif
然而,这是非标准的,因此一些编制者可能拒绝承认它。