Я хочу определить объект класса в структуре и получить доступ к членам функции класса. Можно ли этого добиться?
С помощью следующего кода я получаю ошибку сегментации в ps_test->AttachToInput(2145);
, Я не могу понять причину, все выглядит правильно для меня:
class test
{
public:
test();
virtual ~test();
int init_app(int argc, char* argv[]);
virtual void AttachToInput(int TypeNumber, int DeviceNo=0);
}
struct capture
{
test h_app;
gint port;
};
main()
{
struct capture h_cap;
test *ps_test = &h_cap.h_app;
ps_test->AttachToInput(2145);
}
Прежде всего, единственная разница между class
и struct
в C ++ это то, что члены класса private
по умолчанию и члены структуры public
по умолчанию. Сгенерированные компилятором ctors и dtors видны в обоих случаях — если программист не указал иное (например, они перемещают ctor по умолчанию в private
раздел). В противном случае создание и уничтожение экземпляров пользовательских типов помечены class
было бы невозможно без явного публичного объявления — таким образом, бросая вызов самой цели сгенерированных компилятором функций.
Итак, в основном то, что вы делаете в своем примере, это просто состав двух пользовательских типов, что совершенно законно. Когда вы создаете экземпляр capture
, экземпляр test
также создан.
Что ты не может сделать это публичный доступ AttachToInput()
снаружи test
а также полученный типы test
, Вам нужно объявить функцию public
чтобы эта строка компилировалась:
h_cap.h_app.AttachToInput(); // error: member function of `test` is protected
На другой, не связанной ноте (но я сталкивался с этим, поэтому я упоминаю об этом), ваш class test
содержит необработанный указатель на char
, Удерживать необработанные указатели можно, если время жизни указываемой сущности гарантированно превысит время жизни объекта, содержащего указатель. В противном случае весьма вероятно, что сам объект ответственен за уничтожение указанного объекта. Вы должны быть уверены в том, кто чем владеет и кто отвечает за распределение и освобождение вещей.
РЕДАКТИРОВАТЬСледует отметить, что Алан Стоукс предложил то же самое в разделе комментариев, пока я писал этот ответ. 🙂
EDIT2: Небольшой контроль, неявный доступ по умолчанию также предполагается для базовых классов в зависимости от того, как полученный класс объявлен. Увидеть Каковы различия между структурой и классом в C ++?.
Других решений пока нет …