C++ C++;与类相关的标题

C++ C++;与类相关的标题,c++,oop,class,header,C++,Oop,Class,Header,我一直在阅读关于头文件的不同文章和教程。 我理解头的作用是防止实现“接口”。(还有一些编译优化之类的事情) 我仍然不明白,而且我真的不明白,你总是使用标题吗? 我知道您可以在头文件本身中编写代码块。但那就是我迷路的地方 当我看视频教程时,人们只是在头文件中定义函数。然后另一篇文章只定义了函数(我想这就是接口的概念) 现在我正在创建一个名为Color的简单类。 实施: /* * File: Color.cpp * Author: Sidar * * Created on 26 decemb

我一直在阅读关于头文件的不同文章和教程。 我理解头的作用是防止实现“接口”。(还有一些编译优化之类的事情)

我仍然不明白,而且我真的不明白,你总是使用标题吗? 我知道您可以在头文件本身中编写代码块。但那就是我迷路的地方

当我看视频教程时,人们只是在头文件中定义函数。然后另一篇文章只定义了函数(我想这就是接口的概念)

现在我正在创建一个名为Color的简单类。 实施:

/* 
* 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 */