Мне удалось исправить ошибки (LNK1169 и LNK2005), но почему это работает? - PullRequest
0 голосов
/ 21 июня 2019

Мне удалось исправить ошибку двумя способами, но я, честно говоря, не знаю, почему она работает.Может кто-то здесь, пожалуйста, дать некоторые разъяснения?

Как есть, следующий код дает мне следующие ошибки

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

Я действительно не понимаю, почему первая версия не 'т работа.Есть ли предпочтительный способ справиться с этим, и может ли кто-нибудь дать здесь некоторые разъяснения по поводу различий?

Извините за длинный пост.Я не был уверен, сколько деталей включить.Спасибо, что нашли время, чтобы научить меня!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...