operator << 的一个问题

C、C++和Java语言
回复
头像
liuhello
帖子: 216
注册时间: 2007-04-24 13:44
送出感谢: 0
接收感谢: 0

operator << 的一个问题

#1

帖子 liuhello » 2007-08-07 23:57

代码: 全选

/*我用operator << 的时候总是说Multiple markers at this line
                                - first defined here
                                - multiple definition of `operator<<(std::ostream&, Data&)'
在eclipse下写的程序.
具体代码是:
*/
//*****************************************************************************
//Data.cpp
#include<iostream>
using namespace std;

class Data
{
public:
   friend ostream& operator << (ostream&,Data&);
   Data()
   {
      num = 0;
      den = 0;
   }
   Data(int num,int den)
   {
      this->num = num;
      this->den = den;
   }
private:
   int num,den;
};
ostream& operator << (ostream& out,Data& data)
{
   out<<data.num<<"/"<<data.den<<"   ";
   return out;
}
//*****************************************************************************
//main.cpp
#include "Data.cpp"
//写不写#include <iostream>    using namespace std;  都一样报错
int main()
{
        Data hello(1,3);
        cout<<hello<<endl;
        return 0;
}

/*
而如果把main函数和Data类放在一起又没问题拉  谁能告诉我这是怎么一回事啊,我的程序不能把main和Data类放在一起啊.急啊.
*/
头像
laborer
帖子: 1016
注册时间: 2005-10-25 11:15
送出感谢: 0
接收感谢: 1 次
联系:

#2

帖子 laborer » 2007-08-08 0:16

Data.cpp中定义了operator <<,main.cpp中include了Data.cpp,也就是operator <<在main.cpp又定义了一遍。
于是link的时候发现有两个operator <<的定义。有两种办法解决这个问题:
1. 把Data.cpp从工程中去除,也就是不编译Data.cpp,只编译include了Data.cpp的main.cpp;
2. 把Data.cpp中声明和定义部分拆开分别放在Data.h和Data.cpp中,main.cpp只include Data.h。
hreiser@oakland:~$ killall -9 wife
police@oakland:~$ sudo find / -user hreiser
court@oakland:~$ sudo mv /home/hreiser /jail/
court@oakland:~$ sudo usermod -d /jail/hreiser -s "/usr/sbin/chroot /jail/" hreiser
头像
jiangpeng
帖子: 223
注册时间: 2006-07-25 9:33
送出感谢: 0
接收感谢: 0
联系:

#3

帖子 jiangpeng » 2007-08-08 0:27

代码: 全选

/* data.h */
#ifndef DATA_H
#define DATA_H

#include <iostream>

class Data
{
    friend std::ostream& operator<<(std::ostream&, const Data&);
public:
    Data(int _num, int _den) : num(_num), den(_den) {}
    Data() : num(0), den(0) {}
private:
    int num, den;
};

#endif

代码: 全选

/* data.cpp */
#include "Data.h"

std::ostream& operator<<(std::ostream& out, const Data& data)
{
    return out << data.num << "/" << data.den << " ";
}

代码: 全选

/* main.cpp */
#include "Data.h"

int main()
{
    Data hello(1, 3);
    std::cout << hello << std::endl;
    return 0;
}
Take what man makes and use it, But do not worship it, For it shall pass. -- Anonymous

Twitter @jiangpeng
头像
liuhello
帖子: 216
注册时间: 2007-04-24 13:44
送出感谢: 0
接收感谢: 0

#4

帖子 liuhello » 2007-08-08 0:48

谢谢两位仁兄的 解释
问题解决拉
看来我还得好好的学习C++
回复

回到 “C/C++/Java”