Как разделить экземпляр глобального класса между файлами? - PullRequest
1 голос
/ 22 мая 2019

У меня есть класс myClass, который разбит на файлы .h и .cpp. Затем у меня есть файл main.cpp, в котором я объявляю глобальный экземпляр myClass как

.
myClass class1(0,0);

У меня также есть несколько других файлов cpp, которые используют class1, например Funcs.cpp. Поэтому я создал файл extern extern.h и объявил также экземпляр myClass как extern:

extern myClass class1;

Для myClass доступны два конструктора: один принимает два параметра, а остальные три (перегружены). Нет конструктора, который не принимает никаких параметров. Конструктор с двумя параметрами выглядит примерно так:

myClass:myClass(int id, int mode);

Моя проблема в том, что я получаю следующее сообщение об ошибке:

Идентификатор myClass не определен "extern myClass class1"

... хотя я включил myClass.h в main.cpp, myClass.cpp и extern.h.

Как правильно распределить глобальный экземпляр myClass между несколькими файлами cpp? Я прочитал Проблема, объявляющая объект класса extern , и различия в том, что myClass имеет два параметра, которые он принимает, и что мой глобальный экземпляр объявлен в main.cpp, а не в myClass.cpp.

Ответы [ 3 ]

3 голосов
/ 22 мая 2019

Очень урезанная версия ваших требований, которая должна работать:

myclass.h:

#ifndef MYCLASS_H
#define MYCLASS_H

class myClass
{
public:
        myClass(int, int);
};

#endif // MYCLASS_H

extern.h:

#ifndef EXTERN_H
#define EXTERN_H

#include "myclass.h"
extern myClass class1;

#endif // EXTERN_H

usingextern.cpp:

#include "extern.h"

bool variable_named_class1_exists()
{
        return (bool)&class1;
}

В более современных версиях C ++ / с использованием современных компиляторов я предпочитаю один раз использовать #pragma в качестве защиты вместо #ifndef UNIQUE_ID, #define UNIQUE_ID, #endif, потому что для более крупного проектадействительно трудно не столкнуться с 'UNIQUE_ID'.

3 голосов
/ 22 мая 2019

Проблема может заключаться в порядке включения файлов. Компилятор доверчиво обрабатывает каждую единицу компиляции построчно, включая содержимое файла .h в позиции #include.

Это означает, что вы должны включить myclass.h перед extern.h:

#include "myclass.h"
#include "extern.h"
0 голосов
/ 22 мая 2019

Хотя использование такой глобальной переменной совершенно законно, это больше похоже на код на языке C, нежели на C ++.Тогда вам следует рассмотреть возможность сделать его статическим членом вашего класса.Если вы думаете, что в вашем контексте это значит меньше, то это означает, что ваша переменная также не должна быть глобальной.

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

...