Использование класса / struct / union для нескольких файлов cpp C ++ - PullRequest
2 голосов
/ 27 сентября 2011

Я пытаюсь создать класс в C ++ и получить доступ к элементам этого класса в более чем одном файле C ++. Я попытался более 7 возможных senarios для устранения ошибки, но безуспешно. Я изучил декларацию форвард класса, которая, кажется, не является ответом (я могу ошибаться).

//resources.h
class Jam{
public:
int age;
}jam;

//functions.cpp
#include "resources.h"
void printme(){
std::cout << jam.age;
}

//main.cpp
#include "resources.h"
int main(){
printme();
std::cout << jam.age;
}

Error 1 error LNK2005: "class Jam jam" (?jam@@3VJam@@A) already defined in stdafx.obj

Error 2 error LNK1169: one or more multiply defined symbols found

Я понимаю, что ошибка является множественным определением, потому что я включаю resources.h в оба файла CPP. Как я могу это исправить? Я попытался объявить class Jam в файле CPP, а затем объявить extern class Jam jam; для каждого файла CPP, необходимого для доступа к классу. Я также пытался объявить указатели на класс, но у меня не получилось. Спасибо!

Ответы [ 5 ]

2 голосов
/ 27 сентября 2011

Вы должны отделить ваше определение от вашей декларации.Использование:

//resources.h
class Jam{
public:
int age;
};
// Declare but don't define jam
extern Jam jam;

//resources.cpp
// Define jam here; linker will link references to this definition:
Jam jam;
1 голос
/ 27 сентября 2011

В качестве первого шага вы должны разделить определение класса и объявление экземпляра.Затем используйте extern в resources.h и объявите экземпляр в CPP.

Вот так:

//resources.h
class Jam{
public:
    int age;
};

extern Jam jam;

//functions.cpp
#include "resources.h"
void printme(){
    std::cout << jam.age;
}

//main.cpp
#include "resources.h"
Jam jam;

int main(){
    printme();
    std::cout << jam.age;
}
1 голос
/ 27 сентября 2011

Переменная jam определена в файле H и включена в несколько классов CPP, что является проблемой.

Переменные не должны объявляться в файлах H, чтобы избежать именно этого.Оставьте определение класса в файле H, но определите переменную в one файлов CPP (и если вам нужен глобальный доступ к нему - определите его как extern во всех остальных).

Например:

//resources.h
class Jam{
public:
int age;
};
extern Jam jam; // all the files that include this header will know about it

//functions.cpp
#include "resources.h"
Jam jam; // the linker will link all the references to jam to this one
void printme(){
std::cout << jam.age;
}

//main.cpp
#include "resources.h"
int main(){
printme();
std::cout << jam.age;
}
1 голос
/ 27 сентября 2011

Вы объявляете структуру Jam и , создавая переменную с именем jam этого типа.Компоновщик жалуется, что у вас есть две (или более) вещи, называемые jam, потому что ваш заголовок заставляет каждый файл .cpp объявлять свой собственный.

Чтобы это исправить, измените объявление заголовкак:

class Jam{
public:
int age;
};

extern Jam jam;

А затем поместите следующую строку в один ваших .cpp источников:

Jam jam;
0 голосов
/ 27 сентября 2011

Используйте директиву pragma Once или некоторые определения, чтобы заголовок не включался в ваш код более одного раза.

Пример использования директивы pragma (example.h):

#pragma once
// Everything below the pragma once directive will only be parsed once
class Jam { ... } jam;

Пример использования define (example.h):

#ifndef _EXAMPLE_H
#define _EXAMPLE_H
// This define makes sure this code only gets parsed once
class Jam { ... } jam;
#endif
...