Для чего может понадобиться extern class

221
22 августа 2017, 13:58

Что дает такая конструкция?

 extern class Class obj {};

что не правильно в коде на картинках.

Answer 1

Это ошибочная запись, о чём Вас должен был предупредить компилятор. extern (в таком ключе) применяется только к переменным и функциям, а у Вас нет ни того, ни другого. Если же немного модифицировать пример:

extern class Class 
{
} instance;

, то получится, что мы объявили переменную instance типа Class.

Код выше это просто сокращенная форма такой записи:

class Class 
{
};
extern Class instance;

Т.е. мы определили новый класс Class и объявили объект типа Class с именем instance. Где-то мы должны определить этот объект, иначе при его использовании получим ошибку на этапе компоновки.

Answer 2

К вопросу зачем слово extern вообще нужно:

Допустим у нас есть некоторая глобальная переменная int var, эта переменная одна на всю программу (оставим вопрос о нежелательности глобальных переменных за кадром, пример синтетический). Проект состоит из нескольких файлов .cpp, в каждом нужен доступ к этой переменной. Как реализовать?

Вариант 1

// header.h 
void foo();
int var;

// foo.cpp
#include "header.h"
int var = 42;
void foo() { 
    var = 42;
}

// main.cpp
#include <iostream>
#include "header.h"
int main() {
    foo();
    std::cout << var;
}

Но нет, при компиляции получаем вот это:

foo.cpp:4:5: error: redefinition of 'int var'
 int var;
     ^~~
In file included from foo.cpp:2:0:
header.h:5:5: note: 'int var' previously declared here
 int var;
     ^~~

Это все потому что нам нужно объявить (declare) переменную в заголовочном файле, а мы ее определяем (define).

В header.h рядом с переменной мы объявили функцию foo:

void foo();

По сути мы сказали компилятору - "Вот так выглядит функция foo, но ее определение будет потом (возможно в другом файле)". Как сказать тоже самое о переменных?

Нам нужен инструмент для объявления переменных.

Вот это и есть extern. Меняем одну строчку в header.h:

// header.h 
void foo();
extern int var;

И все работает:

$ g++ main.cpp foo.cpp
$ a.exe
42

extern работает и с функциями, по сути эти два объявления эквивалентны:

extern void foo(); // так обычно не пишут, но это верно 
void foo();

Начиная с С++11 появился еще один вариант использования.

extern работает только с функциями и переменными, но не с классами/структурами, ваша конструкция не имеет смысла (и не скомпилируется). Если надо объявить класс то надо писать так

class Foo;
struct Bar;

P.S Еще extern используется для связки C++ с С (и другими языками), но это уже другая история...

READ ALSO
AIDE C++ Undefined Reference

AIDE C++ Undefined Reference

Доброго! Использую AIDEПытаюсь сделать прототип метода в заголовочном файле, а исполнение в

252
Как узнать есть ли индекс в QList?

Как узнать есть ли индекс в QList?

Узнать есть ли значение 3 функции, а есть ли индекс в QList<int> не понятно

266
Вопрос по циклу for

Вопрос по циклу for

Каким образом производится проверка на истинность j<=(i/j) , ведь по условию выходит, что j всегда будет большеНапример j=2 ; (i/j)=(2/2)=1 --->>> Выходит...

313