使用头文件,类和其他任何东西来降低编译时间? - C ++

时间:2014-03-18 01:54:33

标签: c++ class object compiler-construction header

我正在尝试为自己制作一个程序,以保存我饮用的饮料和食品中使用的成分和化学品的数据库。我是C ++的新手,但我不是一个绝对的初学者,所以我介于初学者和平庸之间。

反正

我创建了一个名为" Drink"的课程,我想让课堂上的对象包括我喝的不同饮料及其信息。我觉得我把它弄下来了,但我需要学习的是如何使用不同的文件?我想制作一个使用不同文件的程序,但也节省了编译时间,基本上是一种方法,如果我编辑一个项目,它不会导致15分钟的编译时间来改变一切,这就是为什么,即使这个在一个程序上工作得很好它不是我想要的。

到目前为止我所学到的是:  1.需要头文件。  2.需要一个(或许多)不同的cpp文件。  3.需要连接它们。

如果你可以并且将会有所帮助,我想要一个详细的解释,如果你可以添加比我当前的方法更好的方法,快捷方式或任何类似的东西我会非常感激。此外,我知道如何选择和回答和投票。谢谢你提前。

 #include <iostream>
 #include <string>
 using namespace std ;

 class Drink
{
public:
    void output_information()
    {
        cout << "Details: " << info << endl ;
    }
    string info ;
};

int main()
{
    string input ;

    Drink Arizona_Green_Tea ;
    Arizona_Green_Tea.info = "\n Premium Brewed Green Tea \n Filtered Water \n High-
        Fructose Corn Syrup \n Honey \n Citric Acid \n Natural Flavors \n Ginseng
        Extract \n Ascorbic Acid " ;

    Drink Honest_Ade_Green_Tea ;
    Honest_Ade_Green_Tea.info = "\n FILTERED WATER \n ORGANIC CANE SUGAR \n FAIR
        TRADE ORGANIC GREEN TEA LEAVES \n ORGANIC HONEY \n NATURAL FLAVOR \n ASCORBIC 
        ACID (VITAMIN C) \n CITRIC ACID" ;

    Drink Vitamin_Water_power_c ;
    Vitamin_Water_power_c.info = "reverse osmosis water \n crystalline \n fructose
        and cane sugar (sweeteners) \n less than 0.5% of: \n vitamin C (ascorbic acid),
        citric \n acid, natural flavors, dragonfruit \n extract, vegetable juice 
       (color), \n magnesium lactate and calcium \n lactate and potassium phosphate \n 
       (electrolyte sources), taurine, \n vitamin B5 (calcium pantothenate), \n zinc
        gluconate, vitamin B6 \n (pyridoxine hydrochloride)\n vitamin B12 \n chromium 
        polynicotinate" ;

cout << "Search Database: " ;
getline(cin , input) ;
cout << endl ;

if(input == "Arizona Green Tea" || input == "arizona green tea" || input == "ARIZONA
    GREEN TEA")
    {
    Arizona_Green_Tea.output_information() ;
    }
if(input == "Honest Ade Green Tea")
    {
    Honest_Ade_Green_Tea.output_information() ;
    }
if(input == "Vitamin Water Power" || input == "vitamin water power-c" || input ==
    "VITAMIN WATER POWER C" || input == "Vitamin Water Power C" || input =="vitamin 
    water red" || input == "Vitamin Water Red" )
     {
    Vitamin_Water_power_c.output_information() ;
     }

     return 0 ;
 }

2 个答案:

答案 0 :(得分:1)

如果您有源文件foo.cpp,则可以像这样构建可执行文件zap

g++ foo.cpp -o zap

或者您可以分两步构建可执行文件,首先从foo.o构建目标文件foo.cpp,然后从zap构建foo.o

g++ -c foo.cpp -o foo.o
g++ foo.o -o zap

(分两步做的原因并不是很明显,但请耐心等待。)

如果你有两个源文件,foo.cppbar.cpp,你可以像这样构建可执行文件:

g++ foo.cpp bar.cpp -o zap

或分两个阶段,如下:

g++ -c foo.cpp -o foo.o
g++ -c bar.cpp -o bar.o
g++ foo.o bar.o -o zap

完成此操作后,假设您修改了foo.cpp。您可以通过这种方式重建zap

g++ -c foo.cpp -o foo.o
g++ foo.o bar.o -o zap

没有理由重建bar.o,因为您没有更改bar.cpp,但仍然会从早期版本中遗留bar.o

(像Make这样的实用程序可以帮助您管理此过程,处理不同的步骤并跟踪哪些文件是最新的,但我们不要试图一次做太多。)

现在,如何将代码分成不同的文件?这涉及翻译单元的主题,这是微妙的,但通常声明进入头文件,源文件包含一组相关的功能。如果有一个类Foo,则类定义(包括成员函数声明)进入Foo.h,成员函数定义进入Foo.cpp

所以在你的情况下,你有Drink.h

#include <string>
using std::string;

class Drink
{
public:
  void output_information();
  string info;
};

Drink.cpp

#include "Drink.h"
#include <iostream>

using namespace std; // saves typing, but not a good idea generally

void Drink::output_information()
{
    cout << "Details: " << info << endl;
}

Main.cpp

#include "Drink.h"
#include <iostream>

using namespace std; // saves typing, but not a good idea generally

int main()
{
  ...
}

答案 1 :(得分:0)

考虑让程序从文件中读取饮品描述。这样,当您的饮料配方发生变化时,您不必重新编译。

今天的词语:google,ifstream,vector。