duplicate symbols for architecture x86_64エラー


私のコンパイラはclion(xcodeの中の環境に基づいて)、システムはmacで、初めてクラスを書く時この間違いが現れました

//
// Created by apple on 2018/5/13.
//

#ifndef C_PRIMERPLUS_SALES_DATA_H
#define C_PRIMERPLUS_SALES_DATA_H

#include 
//#include 
using namespace std;
class Sales_data {
private:
    string bookNo;
    unsigned units_sold;
    double revenue;
public:
    string isbn() const {  //   inline  
        return bookNo;
    }
    Sales_data& combine(const Sales_data& );
    double avg_price() const; //      

    friend Sales_data add(const Sales_data& ,const Sales_data&);
    friend ostream& print(ostream& , const Sales_data&);
    friend istream& read(istream &is,Sales_data &item);

};
Sales_data add(const Sales_data &lhs,const Sales_data &rhs){
    Sales_data sum = lhs;
    sum.combine(rhs);
    return sum;
}
ostream& print(ostream& os, const Sales_data& item){
    os << item.isbn() << " " << item.units_sold << " "
       << item.revenue << " " << item.avg_price();
    return os;
}
istream& read(istream &is,Sales_data &item){
    double price = 0.0;
    is >> item.bookNo >> item.units_sold >> price;
    item.revenue = price * item.units_sold;
    return is;
}


#endif //C_PRIMERPLUS_SALES_DATA_H
//      .c++  
#include "Sales_data.h"

Sales_data& Sales_data::combine(const Sales_data &rhs) {
    units_sold += rhs.units_sold;
    revenue += rhs.revenue;
    return *this;
}
double Sales_data::avg_price() const {
    return revenue/units_sold;
}

エラーは次のとおりです.
duplicate symbol__Z4readRNSt3__113basic_istreamIcNS_11char_traitsIcEEEER10Sales_data in: CMakeFiles/untitled1.dir/main.cpp.o CMakeFiles/untitled1.dir/Sales_data.c++.o duplicate symbol __Z5printRNSt3__113basic_ostreamIcNS_11char_traitsIcEEEERK10Sales_data in: CMakeFiles/untitled1.dir/main.cpp.o CMakeFiles/untitled1.dir/Sales_data.c++.o duplicate symbol _Z3addRK10Sales_dataS1 in: CMakeFiles/untitled1.dir/main.cpp.o CMakeFiles/untitled1.dir/Sales_data.c++.o ld: 3 duplicate symbols for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation) make[3]: * [untitled1] Error 1 make[2]: * [CMakeFiles/untitled1.dir/all] Error 2 make[1]: * [CMakeFiles/untitled1.dir/rule] Error 2 make: * [untitled1] Error 2
そして私は発見しましたoファイルエラーはコンパイル時の問題に違いない.問題を特定した後、すぐに本に何と言いたいのかを発見した.前の第3章には、関数は何度も宣言したり、ファイルにまたがって宣言したりすることができるが、一度しか定義できない.そうしないと、繰り返し定義はコンパイルできないので、間違いない.hファイルに問題が発生しました.友元関数の定義を移動します.c++ファイルで問題が解決しました