По сути, это мой проект по назначению для C ++, и я довольно новичок в C ++, и я получаю эту ошибку. Также наличие ошибки для закомментированного кода в main == не совпадает с операндом
1> Main2.obj: ошибка LNK2019: неразрешенный внешний символ «class std :: basic_ostream> & оператор __cdecl<<(класс std :: basic_ostream> &, класс Заказчик &) «(?? 6 @ YAAAV? $ Basic_ostream @ DU? $ Char_traits @ D @ std @@@ std @@ AAV01 @ AAVCustomer @@@ Z) ссылка на функцию» void __cdecl display (struct Node *) «(? Display @@ YAXPAUNode @@@ Z)
Вот код Main.cpp
#include <iostream>
#include "account.h"#include "cheque.h"#include "customer.h"
using namespace std;
struct Node {
Node* m_next;
Customer& m_customer;
Node(Customer& customer) : m_next(0), m_customer(customer) {}
};
// only for the 1st Node
void initNode(struct Node *head,Customer n){
head->m_customer = n;
head->m_next =NULL;
}
// apending
void addNode(struct Node *head, Customer n) {
Node *newNode = new Node(n);
newNode->m_customer = n;
newNode->m_next = NULL;
Node *cur = head;
while(cur) {
if(cur->m_next == NULL) {
cur->m_next = newNode;
return;
}
cur = cur->m_next;
}
}void insertFront(struct Node **head, Customer n) {
Node *newNode = new Node(n);
newNode->m_customer = n;
newNode->m_next = *head;
*head = newNode;
}
//struct Node *searchNode(struct Node *head, Customer n) {
//Node *cur = head;
//while(cur) {
//if(cur->m_customer == n) return cur;
//cur = cur->m_next;
//}
//cout << "No Node " << n << " in list.\n";
//}
bool deleteNode(struct Node **head, Node *ptrDel) {
Node *cur = *head;
if(ptrDel == *head) {
*head = cur->m_next;
delete ptrDel;
return true;
}
while(cur) {
if(cur->m_next == ptrDel) {
cur->m_next = ptrDel->m_next;
delete ptrDel;
return true;
}
cur = cur->m_next;
}
return false;
}
void deleteLinkedList(struct Node **node)
{
struct Node *tmpNode;
while(*node) {
tmpNode = *node;
*node = tmpNode->m_next;
delete tmpNode;
}
}
void display(struct Node *head) {
Node *list = head;
while(list) {
cout << list->m_customer << " ";
list = list->m_next;
}
cout << endl;
cout << endl;
}
int main()
{
Customer test1("sdfs","sdf2","dsfpppsf","fdgdfg","fdgdsffg");
struct Node *newHead;
struct Node *head = new Node(test1);Customer test2("sdsffs","sdfhhmj2","dsfhfsf","fdgdfgs","fdsggdfg");
Customer test3("sdsdfs","sdllllf2","dsfldfgsf","fdgaghdfg","fdgbvcbdfg");
Customer test4("sdgnfgfs","ssdfsdf2","dsfhjhdsf","fdbvcgdfg","fdgsfddfg");
addNode(head,test2);
display(head);
addNode(head,test3);
display(head);
insertFront(&head,test4);
display(head);
cout << "Deleting the copied list\n";
deleteLinkedList(&newHead);
display(newHead);
return 0;
}
Customer.cpp
#include "customer.h"
using namespace std;Customer::Customer(string init_name, string init_address, string init_telephone, string init_sex, string init_dob)
{
name = init_name;
address = init_address;
telephone = init_telephone;
sex = init_sex;
dob = init_dob;
}void Customer::showPersonDetails(void)
{
cout << "Name : "<< name << endl;
cout << "Address : "<< address << endl ;
cout << "Telephone : "<< telephone << endl;
cout << "Sex : "<< sex << endl ;
cout << "Date of Birth : "<< dob << endl;
}
и, наконец, customer.h
#ifndef CUSTOMER_H
#define CUSTOMER_H
#include <iostream>
#include<string>
using namespace std;
class Customer
{
private:
//
// class members
//
string name;
string address;
string telephone;
string sex;
string dob;
public:
// Constructor
Customer(string init_name, string init_address, string init_telephone, string init_sex, string init_dob);
// a print method
void showPersonDetails(void);
void changeDetails(void);
// This operator is a friend of the class, but is NOT a member of the // class:
friend ostream& operator <<(ostream& s, Customer& a);
};
// This is the prototype for the overload
ostream& operator <<(ostream& s, Customer& a);
#endif
В заголовке у вас есть следующее объявление:
// This operator is a friend of the class, but is NOT a member of the class:
friend ostream& operator <<(ostream& s, Customer& a);
У вас нет определения в вашем файле cpp — вам нужно предоставить определение.
ostream& operator <<(ostream& s, Customer& a)
{
s << a.name << ... etc...
return s;
}
Причина у вас есть линкер ошибка в том, что объявление существует, но нет определения.
В Main.cpp
у тебя есть display
функция, которая использует operator<<
за Customer
:
void display(struct Node *head) {
Node *list = head;
while(list) {
cout << list->m_customer << " "; // this line here uses operator<< for Customer
list = list->m_next;
}
Это компилирует так как operator<<
существует в заголовке, поэтому символ можно найти … но в соединение этап определения объекта ( тело из operator<<
) не может быть найден — так что вы получите unresolved external
ошибка компоновщика.
Вы должны реализовать operator<<
для вашего класса клиента в Customer.cpp
friend ostream& operator <<(ostream& s, Customer& a)
{
s << "Name : " << a.name << endl;
s << "Address : " << a.address << endl ;
s << "Telephone : " << a.telephone << endl;
s << "Sex : " << a.sex << endl ;
s << "Date of Birth : "<< a.dob << endl;
return s;
}