Класс внутри структуры

Я хочу определить объект класса в структуре и получить доступ к членам функции класса. Можно ли этого добиться?

С помощью следующего кода я получаю ошибку сегментации в 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);
}

0

Решение

Прежде всего, единственная разница между 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 ++?.

4

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

Других решений пока нет …

По вопросам рекламы [email protected]