C++ C++;与类相关的标题
我一直在阅读关于头文件的不同文章和教程。 我理解头的作用是防止实现“接口”。(还有一些编译优化之类的事情) 我仍然不明白,而且我真的不明白,你总是使用标题吗? 我知道您可以在头文件本身中编写代码块。但那就是我迷路的地方 当我看视频教程时,人们只是在头文件中定义函数。然后另一篇文章只定义了函数(我想这就是接口的概念) 现在我正在创建一个名为Color的简单类。 实施:C++ C++;与类相关的标题,c++,oop,class,header,C++,Oop,Class,Header,我一直在阅读关于头文件的不同文章和教程。 我理解头的作用是防止实现“接口”。(还有一些编译优化之类的事情) 我仍然不明白,而且我真的不明白,你总是使用标题吗? 我知道您可以在头文件本身中编写代码块。但那就是我迷路的地方 当我看视频教程时,人们只是在头文件中定义函数。然后另一篇文章只定义了函数(我想这就是接口的概念) 现在我正在创建一个名为Color的简单类。 实施: /* * File: Color.cpp * Author: Sidar * * Created on 26 decemb
/*
* File: Color.cpp
* Author: Sidar
*
* Created on 26 december 2011, 16:02
*/
#include <stdio.h>
#include "Color.h"
Color::Color() {
reset();
}
Color::Color(const Color& orig) {
a = orig.a;
r = orig.r;
g = orig.g;
b = orig.b;
}
void Color::reset()
{
a = 0;
r = 0;
g = 0;
b = 0;
}
Color::Color(unsigned int r, unsigned int g, unsigned int b, unsigned int a)
{
this->r = r;
this->g = g;
this->b = b;
this->a = a;
}
Color::~Color() {
r = 0;
g = 0;
b = 0;
}
//getters____________________________
unsigned int Color::getRed() const
{
return r;
}
unsigned int Color::getBlue() const
{
return b;
}
unsigned int Color::getGreen() const
{
return g;
}
unsigned int Color::getAlpha() const
{
return a;
}
//setters____________________________
void Color::setRed(unsigned int r)
{
if(r > 255)r = 255;
if(r < 0)r = 0;
this->r = r;
}
void Color::setGreen(unsigned int g)
{
if(g > 255)g = 255;
if(g < 0)g = 0;
this->g = g;
}
void Color::setBlue(unsigned int b)
{
if(b > 255)b = 255;
if(b < 0)b = 0;
this->b = b;
}
void Color::setAlpha(unsigned int a)
{
if(a > 255)a = 255;
if(a < 0)a = 0;
this->a = a;
}
unsigned int Color::color()
{
return (int)a << 24 | (int)r << 16 | (int)g << 8 | (int)b << 0;
}
/*
*文件:Color.cpp
*作者:Sidar
*
*创建于2011年12月26日,16:02
*/
#包括
#包括“Color.h”
颜色::颜色(){
重置();
}
颜色::颜色(常量颜色和原色){
a=原始a;
r=原始r;
g=原g.g;
b=原始b;
}
void Color::reset()
{
a=0;
r=0;
g=0;
b=0;
}
颜色::颜色(无符号整数r、无符号整数g、无符号整数b、无符号整数a)
{
这个->r=r;
这->g=g;
这->b=b;
这->a=a;
}
颜色::~Color(){
r=0;
g=0;
b=0;
}
//吸气剂____________________________
无符号int-Color::getRed()常量
{
返回r;
}
无符号int-Color::getBlue()常量
{
返回b;
}
无符号int-Color::getGreen()常量
{
返回g;
}
无符号int-Color::getAlpha()常量
{
返回a;
}
//二传手____________________________
void Color::setRed(unsigned int r)
{
如果(r>255)r=255;
如果(r<0)r=0;
这个->r=r;
}
void Color::setGreen(unsigned int g)
{
如果(g>255)g=255;
如果(g<0)g=0;
这->g=g;
}
void Color::setBlue(无符号int b)
{
如果(b>255)b=255;
如果(b<0)b=0;
这->b=b;
}
void Color::setAlpha(无符号整数a)
{
如果(a>255)a=255;
如果(a<0)a=0;
这->a=a;
}
无符号int-Color::Color()
{
return(int)a好的首先,这里是为什么模板只能在头文件中实现的答案:
这不是因为它是通用的,而是因为编译器实际上处理模板的方式。如果你没有得到解释,MSGME:
< P>如果你将方法实现放在头文件中,C++编译器可以选择在调用站点内嵌代码,这样它可以更有效。
如果在头文件中完全定义了一个类,那么就不需要.cpp文件来让事情(如果实现很短的话)更容易理解。头文件不用于“分离接口”从实现来看,它们已经包含了许多实现细节,除非您使用pimpl习惯用法。这是一个不同的主题,可以用任何没有“头”文件(如C#和Java)的语言来完成
它们的真正用途来自这样一个事实:当编译器必须为一个类的实例分配空间时,它必须知道它的大小。要计算它的大小,它需要该类的完整声明。因为您可能要在许多翻译单元中使用该类的实例,所以提供该声明的唯一明智的方法是t在头文件中,并在需要时包含它
当您创建指向实例(或引用)的指针时,编译器不需要知道该类的大小,因为指针通常具有相同的4或8字节大小。对于这些情况,您可以只使用前向声明,而不使用#包括标头
现在,为什么可以在头文件中包含代码是由于当前的C++模板MeCANICS。该代码将被编译多次,但是编译器/链接器将删除所有拷贝,并在最终编译的代码中保留单个副本。
< p>您不“总是”。做任何事情,都取决于环境、目标以及团队或组织的编码标准
C++是一种非常灵活的语言,允许以多种不同的方式完成和组织工作
可能使用单独实现文件的一些原因:
要使实现与接口分离,请执行以下操作:
暗示
加快编译时间
处理循环依赖关系的步骤
因此,您可以提供仅包含头文件而不包含头文件的二进制库
底层源代码
您可能不需要单独的实现文件的一些原因:
您使用模板,“通常”必须使用
声明
您不希望实现与接口分离
很多情况下,这会使事情更容易理解,因为你没有
在头文件和实现文件之间来回翻转
如果您处理的是具有
尽管有很多方法
您希望编译器内联尽可能多的代码
可能
您正在创建一个代码库,但不希望用户使用它
不得不担心构建。大多数Boost库都是
这样,您就不必使用Boost构建系统
这可能是一件很麻烦的事情,但是您只需要包含头文件
在代码中,这就是使用它们所需要做的一切
我通常通过定义头文件中的所有逻辑来开始新类的工作。然后,当类完成时,或者当它在头文件中开始变得拥挤时,我将开始将逻辑移出一个单独的实现文件。这完全是为了充分利用我的时间,因为我能够快速完成事情当我可以看到同一个文件中的所有内容时,错误就更少了
还需要注意的是,您根本不必使用头文件。您可以直接在.cpp文件中定义一些类。这通常是为在该.cpp文件之外永远不会使用的私有类完成的。但是,我什么时候需要像给定代码一样的cpp文件?这就是我需要的地方
/*
* File: Color.h
* Author: Sidar
*
* Created on 26 december 2011, 16:02
*/
#ifndef COLOR_H
#define COLOR_H
#include <string>
class Color {
public:
Color();
Color(const Color& orig);
Color(unsigned int r,unsigned int g,unsigned int b, unsigned int a);
virtual ~Color();
//____________________
void setRed(unsigned int r);
unsigned int getRed()const;
//____________________
void setBlue(unsigned int b);
unsigned int getBlue()const;
//____________________
void setGreen(unsigned int g);
unsigned int getGreen()const;
//____________________
void setAlpha(unsigned int a);
unsigned int getAlpha()const;
//____________________
unsigned int color();
void reset();
private:
unsigned int r;
unsigned int b;
unsigned int g;
unsigned int a;
};
#endif /* COLOR_H */