处理C ++中对象的方法

时间:2019-03-18 06:48:24

标签: c++ filesystems perl-data-structures

每次运行代码编译器时,都会给出已经定义的对象错误,而且我不知道我在整个代码中哪里出错。

即使我在一个文件中全部执行此操作,它也可以正常工作,但我不知道为什么它不能以这种方式工作,任何人都可以帮助我了解我在此代码中的错误之处。

任何帮助将不胜感激。 谢谢

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;
}

Problems occured

这是我编写流代码的部分。

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 个答案:

答案 0 :(得分:1)

您要定义(不仅仅是声明)头文件中的构造函数:

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文件,这会通过一次又一次地声明相同的内容而导致更多的问题。只需将它们添加到project / makefile / etc中,而不包括:

#include "writestr.cpp"