Мне удалось исправить ошибку двумя способами, но я, честно говоря, не знаю, почему она работает.Может кто-то здесь, пожалуйста, дать некоторые разъяснения?
Как есть, следующий код дает мне следующие ошибки
Error LNK2005 "public: __thiscall Person::Person(class std::basic_istream<char,struct std::char_traits<char> > &)" (??0Person@@QAE@AAV?$basic_istream@DU?$char_traits@D@std@@@std@@@Z) already defined in Person_Functions.obj
Error LNK1169 one or more multiply defined symbols found
Программа:
//**************
//Person_Class.h
//**************
#ifndef PERSON_CLASS_H
#define PERSON_CLASS_H
#include <iostream>
#include <string>
using namespace std;
struct Person {
string name;
string address;
string getName() const { return name; }
string getAddress() const { return address; }
Person() = default;
Person(string n, string a) : name(n), address(a) {}
Person(istream& is);
};
ostream& print(ostream&, const Person&);
istream& read(istream&, Person&);
Person::Person(istream& is) { read(is, *this); }
#endif
//********************
//Person_Functions.cpp
//********************
#include "Person_Class.h"
istream& read(istream& is, Person& p) {
is >> p.name >> p.address;
return is;
}
ostream& print(ostream& os, const Person& p) {
os << p.getName() << " " << p.getAddress();
return os;
}
Если я пишу заголовоквот так, вместо этого, ошибки исчезают
//**************
//Person_Class.h
//**************
#ifndef PERSON_CLASS_H
#define PERSON_CLASS_H
#include <iostream>
#include <string>
using namespace std;
//This seems like a "duct tape" fix, feels messy and unorganized.
struct Person;
istream& read(istream&, Person&);
struct Person {
string name;
string address;
string getName() const { return name; }
string getAddress() const { return address; }
Person() = default;
Person(string n, string a) : name(n), address(a) {}
Person(istream& is) { read(is, *this); }
//Defining istream constructor in the class definition fixes the issue
//but as you can see above, this forces me to declare read above the struct
//which means I have to then declare the struct above read
};
ostream& print(ostream&, const Person&);
#endif
//This uses the same Person_Functions.cpp as before
Другое решение, которое я нашел, это вместо этого определить конструктор istream внутри Person_Functions.cpp
Я действительно не понимаю, почему первая версия не 'т работа.Есть ли предпочтительный способ справиться с этим, и может ли кто-нибудь дать здесь некоторые разъяснения по поводу различий?
Извините за длинный пост.Я не был уверен, сколько деталей включить.Спасибо, что нашли время, чтобы научить меня!