在C ++中使用多个文件来实现函数和类

时间:2013-11-26 21:33:52

标签: c++ function class file-io include

我想弄清楚如何制作一个由不同文件组成的程序。我读过这篇文章:

Function Implementation in Separate File

但没有成功。我有3个文件:main.cpp,func.cpp,time.h,当我编译时,我收到此错误消息:

duplicate symbol getOpen(std::basic_ofstream<char, std::char_traits<char> >&)in:
    /var/folders/kp/57zkm0tn1q7b7w0cs7tlf98c0000gn/T//cczaW1Px.o
    /var/folders/kp/57zkm0tn1q7b7w0cs7tlf98c0000gn/T//ccvOCRgc.o
ld: 1 duplicate symbol for architecture x86_64
collect2: ld returned 1 exit status

我不知道这意味着什么。我基本上只是试图打开一个文件,写入它并关闭它。我还创建了一个对象并对其进行了测试。我知道问题来自func.cpp,因为当我删除它时它会起作用。有人可以建议吗?谢谢。

我输入这个来编译:{{1​​}}。

这是我的代码:

time.h中

g++ main.cpp func.cpp

func.cpp

#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <fstream>
using namespace std;

class Time
{
    private:
        int seconds;
        int minutes;
        int hours;
    public:
        Time(int=0, int=0, int=0);
        Time(long);
        void showTime();
};

Time::Time(int sec, int min, int hour)
{
    seconds = sec;
    minutes = min;
    hours = hour;
}

Time::Time(long sec)
{
    hours = int(sec / 3600);
    minutes = int((sec % 3600)/60);
    seconds = int( (sec%60) );
}

void Time::showTime()
{
    cout << setfill('0')
         << setw(2) << hours << ':'
         << setw(2) << minutes << ':'
         << setw(2) << seconds << endl;
}

的main.cpp

#include <iostream>
#include <fstream>
#include <cstdlib>
using namespace std;

int getOpen(ofstream& fileOut)
{
    string filename = "outfile.txt";
    fileOut.open(filename.c_str());

    if( fileOut.fail())
    {
        cout << "\nFailed to open file.\n";
        exit(1);
    }
    else
        return 0;
}

2 个答案:

答案 0 :(得分:1)

您不应#include "func.cpp"加入main.cpp

嗯,这取决于你编译程序的方式。如果只编译main.cpp,那么应该包含func.cpp。但这不是编写程序的好方法,我希望你不会这样做。

您可能想要做的是分别编译main.cpp和func.cpp(使用gcc -c),然后链接.o文件。如果您不将一个.cpp文件包含在另一个文件中,那将完全没问题。但是当你将func.cpp包含到main.cpp中时,两个.o文件都定义了getOpen函数。这会导致错误。

所以:只需删除main中的#include。

答案 1 :(得分:1)

您已将"func.cpp"添加到main.cpp,因此您有getOpen的双重声明。