У меня есть библиотека, написанная для меня на C. В библиотеке есть переменная, которую мне нужно использовать
В foo.h (который находится в C)
extern mystruct foobar;
В bar.h (который находится в C ++)
У меня есть следующий класс.
#include foo.h
class myfoo {
private:
mystruct foobar;
}
Что мне хотелось бы знать, так это то, что если я создам массив myfoo, будет ли каждый экземпляр foobar ссылаться на одну и ту же переменную, или каждый экземпляр будет иметь свое собственное уникальное создание экземпляра myfoo, независимое от других foobar myfoo?
Вот сделка: вы не с помощью foo.h
«s foobar
переменная в bar.h
(это особенно верно, потому что foo.h
только объявляет foobar
определение должно быть в файле реализации). Скорее, вы перераспределяете переменную с тем же именем и типом в области видимости класса.
При этом применяются все нормальные правила для переменной-члена экземпляра. В частности, каждый случай myfoo
будет иметь свой собственный экземпляр foobar
,
Если вы удалили декларацию из foo.h
ничего не изменится: декларация совершенно неактуальна для вашего bar.h
файл.
foobar
член внутри определения класса myfoo
определяется в другом объеме от foobar
в глобальном масштабе. Это разные переменные, не связанные друг с другом, за исключением того, что они относятся к одному типу и имеют одно и то же имя (хотя и в разных областях).
Если вы создаете массив myfoo
объекты, каждый из которых будет иметь экземпляр mystruct
, Все эти экземпляры будут отделены от одного, объявленного в глобальной области видимости.
То, что я хотел бы знать, если я создам массив 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, или что вы используете).