Ошибка множественного определения в C ++ при использовании разных файлов для объявления функции / вектора - PullRequest
0 голосов
/ 16 апреля 2020

Извините за этот обширный (основной) вопрос, но у меня возникла проблема при попытке отделить мою функцию main () от моего чтения. cc файла.

Сначала я написал main () в моем чтении. cc, так как его было проще тестировать, и он работал отлично. Сейчас я модулирую свой код и использую main () в другом файле ( main. cc), но я получаю «Ошибка множественного определения».

//course.h
#ifndef _COURSE_H
#define _COURSE_H

#include "dependencies.h"
class Course{

    public:
        int id;
        std::string id_if;
        std::string name;
        std::string dayTime;
};

#endif


//read.h

#ifndef _READ_H
#define _READ_H

#include "../Classes/course.h"

#include "../Classes/dependencies.h"

using namespace std;

vector <Course*> course;

void readCourse();

void courseCheck(Grade* a, string* temp);
void dispoCheck(Teacher* teacher, string* temp, int day);
const vector<string> explode(const string& s, const char& c);

#endif


//read.cc

void readCourse(){
    Course* inp = new Course();

    ifstream file;
    file.open("../Data/Cursos.csv");

    string temp;

    getline(file, temp, '\n');

    while(file.good()){
            getline(file, temp, ';');      
            inp->id = stoi(temp);

            getline(file, inp->id_if, ';');

            getline(file, inp->name, ';');

            getline(file, inp->dayTime, '\n');
        }

    course.push_back(inp);

}


//main.cc

#include "Input/read.h"

int main(){

    readCourse();

}

Ошибка:

g++ main.cc Input/read.cc -o exe -lm

/tmp/ccyRgnlM.o:(.data+0x0): multiple definition of `course'
/tmp/ccoTZsnQ.o:(.data+0x0): first defined here
collect2: ld returned 1 exit status

1 Ответ

1 голос
/ 16 апреля 2020

Из вашего кода не понятно, что вы пытаетесь сделать. Поскольку course используется только для каждого метода readCourse, поэтому он может быть объявлен локально внутри функции.

Я бы предположил, что (не показано) вы также хотите использовать его в main.

Поскольку это C ++ (а не C), лучше избегать глобальных переменных. Ваша переменная course должна быть членом класса * stati c, возможно, самим классом Course (и поскольку это список, лучше использовать имя во множественном числе). Кроме того, ваш readCourse метод должен быть членом c, например,

//course.h
class Course{

    public:
        int id;
        std::string id_if;
        std::string name;
        std::string dayTime;

        static std::vector<Course*> courses;
        static void readCourse(); 
};

// course.cc
void Course::readCourse(){
    ...
}

std::vector<Course*> courses; // Defines you single courses object

, затем в main() вы можете получить к нему доступ с помощью:

int main(){

    Course::readCourse();

    Course::courses[0]->doSomething();
}

}

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