Способ обработки объектов в C ++ - PullRequest
0 голосов
/ 18 марта 2019

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

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

Любая помощь будет оценена.Спасибо

student.h

ifndef STUDENT
define STUDENT

class Student
{

public:
    char student_no[10];
    char student_name[20];
    char student_address[20];
    char student_score[20];
    Student();

};

Student::Student()
{//constructor
    student_no[0] = 0; student_name[0] = 0; student_address[0] = 0;
    student_score[0] = 0;
}

#endif

student.cpp

using namespace std;
#include "writestr.cpp"
#include <fstream>
#include <string.h>
#include <iostream>



int main(){
    char filename[20];
    Student s;
    cout << "Enter the file name:" << flush;
    cin.getline(filename, 19);
    ofstream stream(filename, ios::out);
    if (stream.fail()) {
        cout << "File open failed!" << endl;
        return 0;
    }
    while (1) {
        cin >> s; // read fields of person
        if (strlen(s.student_name) == 0) break;
        // write person to output stream
        stream << s; // write fields of person
    }
    return 1;
}

Возникли проблемы

Это часть, где я пишу код потоковой передачи.

writestr.cpp

using namespace std;
#include "readper.cpp"
#include <fstream>
#include <string.h>
#include <iostream>

ostream & operator << (ostream & stream, Student & s)
{ // insert fields into file
    stream << s.student_name << s.student_no << s.student_address
        << s.student_score;
    return stream;
}

readper.cpp

using namespace std;
#include "student.h"
#include <fstream>
#include <string.h>
#include <iostream>   
istream & operator >> (istream & stream, Student & s)
{ // read fields from input
    cout << "Enter Student Name, or <cr> to end: " << flush;
    stream.getline(s.student_name, 30);

    if (strlen(s.student_name) == 0) return stream;
    cout << "Enter Student Name: " << flush; stream.getline(s.student_name, 30);
    cout << "Enter Student Id Number: " << flush; stream.getline(s.student_no, 30);
    cout << "Enter Address: " << flush; stream.getline(s.student_address, 30);
    cout << "Enter Score: " << flush; stream.getline(s.student_score, 15);

    return stream;
}

1 Ответ

1 голос
/ 18 марта 2019

Вы определяете (не просто декларируете) конструктор в заголовочном файле:

Student::Student()
{//constructor
    student_no[0] = 0; student_name[0] = 0; student_address[0] = 0;
    student_score[0] = 0;
}

Это снова и снова определяет конструктор (генерирует код) в каждом cpp, который включаетфайл заголовка.Поскольку в этом определении нет ключевого слова inline, оно может существовать в программе ровно один раз, а не несколько раз.Определение не встроенного конструктора в нескольких единицах перевода (файлах cpp) приводит к ошибке.

Возможные решения:

  1. Переместить определение конструктора в класс или
  2. Добавьте префикс к ключевому слову inline или
  3. Переместите его в один из файлов cpp

Другая проблема: вы включаете файлы cpp, которые вызывают гораздо больше проблем, объявляяодно и то же снова и снова.Просто добавьте их в проект / makefile / etc, вместо того, чтобы включать:

#include "writestr.cpp"
...