Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 14.06.2013
Сообщений: 34
1

Как скрыть поле для файла main?

24.09.2014, 02:16. Показов 1598. Ответов 24
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Привет всем. Есть два файла: main и device. В device имеется определение структуры:
C++
1
2
3
4
5
6
typedef struct
{
    int a;
    float b;
    void (* Init)(void); // указатель на функцию инициализации устройства
}Device;
В main я создаю экземпляр этой структуры, но не хочу, чтобы Init был виден из main-а (а в редакторе он сейчас подсвечивается, мол, вижу это поле в структуре).
Как скрыть это поле для файла main?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.09.2014, 02:16
Ответы с готовыми решениями:

Как скрыть поле в сводной таблице?
В области СТРОКИ есть ПОЛЕ "Номер" как его скрыть? Например 1 Иванов 20 2 Петров 30 3 ...

Как скрыть поле формы file
У меня такая ситуация, в модальном окне должна быть кнопка Выбрать фото (выглядит она просто как...

Как правильно скрыть Ruchtext поле?
Как правильно скрыть RuchText поле?

Как передать (или присвоить) имя в поле класса из main?
Листинг: #include <iostream> #include <string> using namespace std; class Myname { string...

24
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
24.09.2014, 04:17 2
Цитата Сообщение от Arlleex Посмотреть сообщение
Как скрыть это поле для файла main?
Никак. Да, и смысл? Скрывают реализации, а не интерфейс.
1
Эксперт функциональных языков программированияЭксперт Java
4486 / 2721 / 485
Регистрация: 28.04.2012
Сообщений: 8,590
24.09.2014, 07:31 3
Цитата Сообщение от Arlleex Посмотреть сообщение
В main я создаю экземпляр этой структуры, но не хочу, чтобы Init был виден из main-а (а в редакторе он сейчас подсвечивается, мол, вижу это поле в структуре).
C++
1
2
3
4
5
6
7
typedef struct
{
    int a;
    float b;
private:
    void (* Init)(void);
} Device;
Впрочем, с вопросами по C++ лучше в раздел по C++.
1
0 / 0 / 0
Регистрация: 14.06.2013
Сообщений: 34
24.09.2014, 11:23  [ТС] 4
alsav22, ну, т.е. если я сделал вызов функции по указателю на нее, я скрыл реализацию? Или я как-то путаю это понятие? Раскройте, пожалуйста, Ваш ответ.
korvin_, я пишу на чистом Си, и пытаюсь реализовать в некотором смысле фишку C++.
0
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
24.09.2014, 11:26 5
Цитата Сообщение от Arlleex Посмотреть сообщение
пытаюсь реализовать в некотором смысле фишку C++.
Какую именно?
1
0 / 0 / 0
Регистрация: 14.06.2013
Сообщений: 34
24.09.2014, 11:37  [ТС] 6
Что-то типа виртуальных функций, где реализацию методов объекта буду менять динамически, присваивая реализации указателю на функцию в структуре.
Но а визуально чисто хотелось бы не знать, что там в этой структуре еще расположено, т.е. для файлов "железа" структура выглядит полноценной и они имеют доступ ко всем ее элементам, а для main (т.е. для программы пользователя) - только те параметры и функции, которые он должен использовать и ничего лишнего.
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
24.09.2014, 11:44 7
Цитата Сообщение от Arlleex Посмотреть сообщение
Раскройте, пожалуйста, Ваш ответ.
Это вы раскройте, что подразумеваете под:
Цитата Сообщение от Arlleex Посмотреть сообщение
но не хочу, чтобы Init был виден из main-а
Я может про другое написал.
1
0 / 0 / 0
Регистрация: 14.06.2013
Сообщений: 34
24.09.2014, 12:15  [ТС] 8
В общем так.
В файле device есть структура
typedef struct
C++
1
2
3
4
5
{
    int a;
    float b;
    void (* Init)(void);
}Device;
Создаю экземпляр этого объекта в основной программе:
C++
1
2
3
4
5
6
int main(void)
{
   ...
   Device MyDevice;
   MyDevice.(здесь редактор подсвечивает варианты (все поля структуры), но из этого файла (main) я не хочу видеть в структуре указатель Init)
}
Дело в том, что я хочу абстрагироваться от железа, чтобы пользователь, когда делает что-то с объектом MyDevice, не знал, что там есть какие-то переменные, кроме тех, что ему даны в чистом виде - это int a, float b.
Таким образом пользователь не сможет "накосячить", записав не в тот элемент структуры чего-нибудь ненужного.
Получается, что в системных файлах, которые работают с кодом железа, структура видна полностью, а для пользователя она существует как
C++
1
MyDevice.a
или
C++
1
MyDevice.b
и больше в этой структуре для него ничего нет.
0
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
24.09.2014, 12:31 9
Цитата Сообщение от Arlleex Посмотреть сообщение
Дело в том, что я хочу абстрагироваться от железа, чтобы пользователь, когда делает что-то с объектом MyDevice, не знал, что там есть какие-то переменные, кроме тех, что ему даны в чистом виде - это int a, float b.
Таким образом пользователь не сможет "накосячить", записав не в тот элемент структуры чего-нибудь ненужного.
Ну так сделайте 2 версии вашей структуры: одну с которой сможет работать только пользователь (например в мейне), и вторую "для спецфункций" со всеми плюшками.
1
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
24.09.2014, 12:38 10
Arlleex, вы не путаете процесс написания кода с процессом использования? Редактор в любом случае будет подсвечивать поля структуры. Какое отношение это имеет к собранному exe? Если хотите, чтобы из main() не были доступны поля, то делайте их приватными, и делайте публичные методы для работы с этими полями. В этих методах уже предусмотрите, чтобы:
Цитата Сообщение от Arlleex Посмотреть сообщение
пользователь не сможет "накосячить", записав не в тот элемент структуры чего-нибудь ненужного.
1
0 / 0 / 0
Регистрация: 14.06.2013
Сообщений: 34
24.09.2014, 12:39  [ТС] 11
Это, т.е., получится примерно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
typedef struct
{
    int a;
    int b;
    int c;
    int d;
}Device;
typedef struct
{
    int a;
    int: 32;
    int c;
    int d;
}UserDevice;
 
int main(void)
{
    Device MyDevice;
    UserDevice * pUserDevice = &MyDevice;
    ...
    pUserDevice->a;
    // переменная b тут не видна
    pUserDevice->c;
    pUserDevice->d;
}
HighPredator, Вы так имеете ввиду?
Но тут все равно создается начальный экземпляр MyDevice со всеми полями в структуре, и пользователь все-таки сможет залезть туда ненароком...
Все же если нет таких методов, то никто не погибнет, в любом случае Я просто хотел узнать, есть ли какие-то способы реализовать подобный "инструментарий"
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
24.09.2014, 12:43 12
Цитата Сообщение от Arlleex Посмотреть сообщение
и пользователь все-таки сможет залезть туда ненароком...
Можете описать, как это может произойти?
1
0 / 0 / 0
Регистрация: 14.06.2013
Сообщений: 34
24.09.2014, 12:46  [ТС] 13
MyDevice.b = 5, например, в данном случае. Но b то мы пытались ограничить от доступа.
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
24.09.2014, 12:56 14
Вы под пользователем, кого имеете ввиду? Того, кто вашим кодом будет пользоваться, или того, кто будет пользоваться собранной программой?

Добавлено через 1 минуту
Цитата Сообщение от Arlleex Посмотреть сообщение
MyDevice.b = 5, например, в данном случае. Но b то мы пытались ограничить от доступа.
Для этого вот:
Цитата Сообщение от alsav22 Посмотреть сообщение
Если хотите, чтобы из main() не были доступны поля, то делайте их приватными, и делайте публичные методы для работы с этими полями.
Добавлено через 7 минут
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
typedef struct
{
private: 
    int a;
    int b;
 
public:
    void seta(int x){a = x;}
    void setb(int x){b = x;}
    int  geta() const
    {return a;} 
    int  getb() const
    {return b;} 
} Device;
1
0 / 0 / 0
Регистрация: 14.06.2013
Сообщений: 34
24.09.2014, 13:05  [ТС] 15
Вы под пользователем, кого имеете ввиду? Того, кто вашим кодом будет пользоваться, или того, кто будет пользоваться собранной программой?
Того, кто будет пользоваться моим кодом. И для себя. Допустим, чтобы не знать, зачем в структуре еще дюжина параметров. Например, для вывода в порт хотелось бы видеть примерно только такие поля:
C++
1
2
Port.In();
Port.Out();
при применении операции "точка" к объекту структуры.
Но в действительности объект Port содержит еще кучу параметров
Как-то так, криво, я попытался донести то, что я хотел получить, и вроде как, получил, спасибо всем!

Добавлено через 7 минут
Жаль, что в стандартном Си-компиляторе нет private, и прочих ключевых слов C++ и соответствующих механизмов...
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
24.09.2014, 13:12 16
Цитата Сообщение от Arlleex Посмотреть сообщение
Например, для вывода в порт хотелось бы видеть примерно только такие поля:

C
1
2
Port.In();
Port.Out();
при применении операции "точка" к объекту структуры.
Среда всё равно покажет все поля структуры, даже приватные. Компилятор выдаст ошибку (или до компиляции будет посказка-подчёркивание), что поле недоступно.
Миниатюры
Как скрыть поле для файла main?  
0
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
24.09.2014, 13:21 17
Цитата Сообщение от Arlleex Посмотреть сообщение
Вы так имеете ввиду?
Нет не так. Я имею ввиду нечто наподобие:
main.c
C
1
2
3
4
5
6
7
8
9
10
#include "hardware_module.h"
 
int main(void)
{
  UserAccessibleDeviceData userData;
  /* как-то что-то делаем */
  WorkWithDevice(&userData); /* работаем с железом через "железные функции" */
  /* ... */
  return 0;
}
hardware_module.h
C
1
2
3
4
5
6
7
typedef struct
{
  int a;
  int b;
} UserAccessibleDeviceData;
 
extern void WorkWithDevice(const UserAccessibleDeviceData* p_data);
hardware_module.c
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/* все инклуды */
 
typedef struct
{
  int a;
  int b;
  char* restrictedAccessData;
} DeviceData;
 
void WorkWithDevice(const UserAccessibleDeviceData* p_data)
{
  DeviceData deviceData;
  deviceData.a = p_data->a;
  deviceData.b = p_data->b;
  /* как-то работаем с "железными" данными */
  /* делаем что-то еще */
}
Добавлено через 2 минуты
Как-то так. Код схематичный.
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
24.09.2014, 13:37 18
HighPredator, я так понял, ТС другого хочет:
Цитата Сообщение от Arlleex Посмотреть сообщение
Например, для вывода в порт хотелось бы видеть примерно только такие поля:
C
1
2
Port.In();
Port.Out();
при применении операции "точка" к объекту структуры.
Только эти поля видеть (в подсказке), а не все.
0
HighPredator
24.09.2014, 13:41
  #19

Не по теме:

Цитата Сообщение от alsav22 Посмотреть сообщение
Только эти поля видеть (в подсказке), а не все.
Ну фиг знает... У меня в студии настройки такие, что она покажет все вообще поля какие есть. Только в зависимости от спецификатора доступа будут рядом значки всякие... Чтобы вообще не показывалось... Ну может настроить как-то надо... Или хакнуть студию xD

0
Эксперт функциональных языков программированияЭксперт Java
4486 / 2721 / 485
Регистрация: 28.04.2012
Сообщений: 8,590
24.09.2014, 14:41 20
Arlleex, зачем тебе тогда вообще делать Init -- полем структуры?
0
24.09.2014, 14:41
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.09.2014, 14:41
Помогаю со студенческими работами здесь

Как скрыть поле из бд после выполнения функции
Здравствуйте, у меня есть система тестирования и я хочу добавить возможность, чтобы после того как...

Как нажатием кнопки скрыть текстовое поле?
Добрый день! Ситуация такая: есть 2 текстовых поля, которые пользователь должен заполнить и одна...

Как скрыть моргающую каретку в поле Edit
Есть поле Edit1, хочу туда залить цвет, но всю картину портит моргающая каретка. Есть...

Как можно скрыть поле и его подпись в форме?
Как можно скрыть поле и его подпись в форме? Заранее спасибо.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru