如果不直接从代码中使用,为什么要包含<string>?</string>

时间:2013-10-21 12:06:34

标签: c++ string header-files

我正在努力学习c ++的基础。

在一本书中,有这样的:

  

例如,因为我们的Sales_data类有一个字符串成员,所以Sales_data.h必须   #include字符串标题。正如我们所见,使用Sales_data的程序也是如此   需要包含字符串标题才能使用bookNo(如果是Sales_data)

简短的问题:其实我需要一个理论上的解释:如果我包含一个使用std :: string的标题(所以它导入字符串),为什么我需要再次导入程序使用标题?

长问题

我尝试创建这样的演示程序:

Sales_data.h

#include <string> 

struct Sales_data {
    std::string bookNo;
    unsigned units_sold = 0;
    double revenue = 0.0;
};

prog2.cpp

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

int main()
{
    Sales_data data1, data2;
    double price = 0;  // price per book, used to calculate total revenue

    std::cin >> data1.bookNo >> data1.units_sold >> price;
    data1.revenue = data1.units_sold * price;

    std::cin >> data2.bookNo >> data2.units_sold >> price;
    data2.revenue = data2.units_sold * price;

    if (data1.bookNo == data2.bookNo) {
        unsigned totalCnt = data1.units_sold + data2.units_sold;
        double totalRevenue = data1.revenue + data2.revenue;

        std::cout << data1.bookNo << " " << totalCnt 
                  << " " << totalRevenue << " ";
        if (totalCnt != 0)
            std::cout << totalRevenue/totalCnt << std::endl;
        else
            std::cout  << "(no sales)" << std::endl;

        return 0;  // indicate success
    } else {
        std::cerr << "Data must refer to the same ISBN" 
                  << std::endl;
        return -1; // indicate failure
    }

}

实际上,我在Linux下用

编译了它
g++ prog2.cpp -o prog2 -std=c++11

但是它在prog2.cpp代码中运行时不需要#include <string>

那么:这本书是错误的,还是一个'案例',因为g ++还能运作良好?

请注意,在本书的代码中,prog2.cpp文件中也有一个#include <string>,所以我无法理解它是否更好或者是强制性的,但没有它就可以正常工作! < / p>

*重要编辑 *

这本书告诉我这个:

  

因此,使用Sales_data的程序将包含字符串   标题两次:一次直接和一次作为包含的副作用   Sales_data.h。因为标题可能不止一次包含,我们   需要以一种安全的方式编写标题,即使标题是   包括多次

3 个答案:

答案 0 :(得分:2)

这本书没有错。虽然不是直接的,但您仍然可以通过<string>包含#include "Sales_data.h"

如果您需要完全定义的类型,那么是的,您需要完整的定义,通常在头文件中。

当您包含某些内容时,内容会有效地粘贴到您的翻译单元中。您可以在prog2.cpp中将您的代码读作:

#include <iostream>

#include <string> 

struct Sales_data {
    std::string bookNo;
    unsigned units_sold = 0;
    double revenue = 0.0;
};

int main()
{
    Sales_data data1, data2;
    double price = 0;  // price per book, used to calculate total revenue

    ///.............
    ///.............
    ///.............

答案 1 :(得分:1)

  

如果我包含一个使用std :: string的标题(所以它导入字符串),为什么我需要使用标题在主程序中再次导入?

你不必。如果你正在使用字符串,那么自己包含标题是一个好主意,而不是依赖其他标题来包含它;但你没有必要,只要包含它,代码就会编译。如果您没有使用字符串,则无需包含字符串。

如果你的报价是准确的,那么这本书似乎告诉你必须,而不仅仅是你应该。这是错误的,但可能是一种合理的简化,以鼓励良好的习惯。

答案 2 :(得分:0)

我认为你在这里的困惑是你把“程序”的意思是“我的cpp文件包含main()”,而本书的意思是“所有编译在一起的源代码来创建最终的可执行文件”

prog2.cpp包括Sales_data.hSales_data.h包括<string>,因此<string>确实包含在该计划中。