在C ++中使用头文件

时间:2013-12-01 17:56:04

标签: c++ header-files

我有三个文件Date.cpp,program.cpp和Date.h如下:

Date.h:

struct Date{
int mm, dd, yy;
void display();
};

Date.cpp

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

using namespace std;

void Date::display()
{

    string m[12] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug",  "Sep",  "Oct", "Nov", "Dec"

    };

    cout << m[mm-1] << ' ' << dd << ", " << yy<<endl;

}

program.cpp:

#include "Date.h"
#include <iostream>
using namespace std;

int main
{

    Date today = {7,1,1867};
    cout << "Today is ";
    today.display();
    return 0;
}

当我尝试使用编译时:

g++ Date.cpp program.cpp -o Date

我收到一大堆抱怨program.cpp的错误,例如:

extended initializer lists only available with -std=c++11  or -std=gnu++11{enabled by default]. 
expected '}' before 'today'. 
expected ',' or ';' before 'today'. 
'cout' does not name a type. 
'today' does not name a type. 
expected unqualified-id before 'return'. 
expected declaration before '}' token. 

任何帮助解决这些错误都将不胜感激,谢谢

5 个答案:

答案 0 :(得分:3)

导致错误的原因是您不能以尝试构造Date对象的方式使用初始化列表,除非您使用-std=c++11标志编译程序。

更改

Date today = {7,1,1867};

Date today;
today.dd = 7;
today.mm = 1;
today.yy = 1867;

或为Date类提供构造函数

struct Date{
Date( int m, int d, int y) : mm( m ), dd( d ), yy( y ) {}
int mm, dd, yy;
void display();
};

并像往常一样使用它:Date today(7,1,1867);

答案 1 :(得分:1)

编译-std=c++11编译Date today = {7,1,1867}; 而且你的标题中可能需要#pragma once(或ifndef包括守卫) - 虽然这在你特定的情况下并不重要(假设你展示了整个事情)。

答案 2 :(得分:1)

尝试通过构造函数初始化对象:

struct Date{
  int mm, dd, yy;
  Date( int _mm, int _dd, int _yy ) : mm( _mm ), dd( _dd ), yy( _yy ) {}
  void display();
};

在你的主体,

Date today( 7,1,1867 );

另外,正如所指出的,C ++ 11支持数组的初始化列表,因此您需要为编译器设置适当的标志。

编辑:

此外,在访问m[mm-1]之前,您应该检查mm是否<= 12

答案 3 :(得分:1)

您提供的代码存在多个错误,以及您可以采取的一些措施来改进它。

首先修复你的主要内容:

int main() // put the opening and closing parenthesis after 'main'
{

    Date today = {7,1,1867};
    cout << "Today is ";
    today.display();
    return 0;
}

接下来,确保您的头文件具有正确的标题保护:

#ifndef DATE_H
#define DATE_H

struct Date{
    int mm, dd, yy;
    void display();
};

#endif /* DATE_H */

您可以在此处详细了解这些标题保护的用途:http://en.wikipedia.org/wiki/Include_guard

接下来,您需要为Date类提供构造函数。

Date( int mm, int dd, int yy);

你的许多问题都是文体问题,但遵守这些标准非常重要。

答案 4 :(得分:1)

现在,您正在尝试使用聚合初始化,但是(因为它包含成员函数)Date不是聚合。

C ++ 11添加了初始化列表,这将允许您使用相同的语法,但您使用的编译器显然要求您在允许之前明确启用C ++ 11功能。

我在这里看到四种选择。一个是错误消息建议:启用C ++ 11功能,并享受乐趣。第二个是向ctor类添加Date,并使用括号而不是大括号括起初始化列表:

struct Date { 
    int mm, dd, yy;

    Date(int mm, int dd, int yy) : mm(mm), dd(dd), yy(yy) {}
};

// ...
Date today = Date(8, 1, 1867);

在这种情况下,第三种(也许是迄今为止最好的)替代方案是摆脱display成员函数,而不是重载operator<<,所以你的Date 是一个聚合,你将能够像你想要的那样使用聚合初始化:

struct Date {
    int mm, dd, yy;
};

std::ostream &operator<<(std::ostream &os, Date const &d) {
    static const string m[12] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug",  "Sep",  "Oct", "Nov", "Dec"};

    os << m[mm-1] << ' ' << dd << ", " << yy;
}

然后,您将能够使用普通的C ++惯用语来初始化和显示日期对象:

 Date d = {8, 1, 1867};

 cout << d << "\n";

最后的选择是自己跳过定义任何,并使用标准库中内置的日期和时间功能。 struct tm已经提供了日,月和年的字段,strftime(以及其他)支持根据您的选择格式化日期/时间(不仅包括月份的缩写名称,还包括基于a的本地化名称)选择的区域设置,如果您选择)。