Использование переменных Extern из заголовочных файлов C с переполнением стека

У меня есть библиотека, написанная для меня на C. В библиотеке есть переменная, которую мне нужно использовать
В foo.h (который находится в C)

extern mystruct foobar;

В bar.h (который находится в C ++)
У меня есть следующий класс.

#include foo.h

class myfoo {

private:
mystruct foobar;
}

Что мне хотелось бы знать, так это то, что если я создам массив myfoo, будет ли каждый экземпляр foobar ссылаться на одну и ту же переменную, или каждый экземпляр будет иметь свое собственное уникальное создание экземпляра myfoo, независимое от других foobar myfoo?

1

Решение

Вот сделка: вы не с помощью foo.h«s foobar переменная в bar.h (это особенно верно, потому что foo.h только объявляет foobarопределение должно быть в файле реализации). Скорее, вы перераспределяете переменную с тем же именем и типом в области видимости класса.

При этом применяются все нормальные правила для переменной-члена экземпляра. В частности, каждый случай myfoo будет иметь свой собственный экземпляр foobar,

Если вы удалили декларацию из foo.h ничего не изменится: декларация совершенно неактуальна для вашего bar.h файл.

5

Другие решения

foobar член внутри определения класса myfoo определяется в другом объеме от foobar в глобальном масштабе. Это разные переменные, не связанные друг с другом, за исключением того, что они относятся к одному типу и имеют одно и то же имя (хотя и в разных областях).

Если вы создаете массив myfoo объекты, каждый из которых будет иметь экземпляр mystruct, Все эти экземпляры будут отделены от одного, объявленного в глобальной области видимости.

3

То, что я хотел бы знать, если я создам массив myfoo, будет ли каждый
экземпляр foobar ссылается на одну и ту же переменную, или каждый из
Экземпляр будет его собственным уникальным экземпляром MyFoo, который независим
с других MyFoo Foobars?

если вы делаете это:

#include foo.h

class myfoo
{
private:
mystruct foobar;
};

void func()
{
myfoo f[3];
// ...
}

вы создаете 3 разных MYFOO объекты, каждый со своим Foobar пример.

если вы измените объявление myfoo следующим образом:

#include foo.h

class myfoo
{
private:
static mystruct foobar;
};

// this extra declaration is required for
// static member variables
mystruct myfoo::foobar;

void func()
{
myfoo f[3];
// ...
}

затем три экземпляра myfoo поделятся своим единственным экземпляром foobar.

НОТА:

class myfoo Объявление может быть в файле .h или в файле .cpp.

mystruct myfoo::foobar; Объявление может появляться только один раз, поэтому обычно оно должно быть в файле .cpp (или .cc, или что вы используете).

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector