powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Проверка существования члена класса
20 сообщений из 20, страница 1 из 1
Проверка существования члена класса
    #39280443
Pupkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Имеем класс:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
class Example : public TForm
{
private:
  int aaa;

protected:
  int bbb;

public:
  __fastcall Example();
  __fastcall ~Example();
__published:
};


Как узнать, что члены Example->aaa и Example->bbb существуют?
...
Рейтинг: 0 / 0
Проверка существования члена класса
    #39280444
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Раз ты их объявил, значит они существуют.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Проверка существования члена класса
    #39280459
Pupkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov

А если если ты их объявил, а мне не сказал. Тогда как?
...
Рейтинг: 0 / 0
Проверка существования члена класса
    #39280475
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PupkinА если если ты их объявил, а мне не сказал. Тогда как?

Это как? Я тебе не дал .h файл? Тогда для тебя не существуют ни члены, ни сам класс.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Проверка существования члена класса
    #39280485
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
это c# и java так повреждают мозг?
...
Рейтинг: 0 / 0
Проверка существования члена класса
    #39280498
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Могу предположить что Пупкин создал это в продолжение того
что мы обсуждали 19437092
...
Рейтинг: 0 / 0
Проверка существования члена класса
    #39280500
Pupkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Знаете, Dimitry... С++ не ограничен классом Example.

Задумайтесь. У Вас есть хедер файлы для TForm, TButton и т.п.?
А как называется член, где TForm хранит свой Top (например).
Могу догадываться, что в FTop, но наверняка не знаю. А хочу !!!

Ответьте на вопрос, если можете, а не о том кто кому что дает.
...
Рейтинг: 0 / 0
Проверка существования члена класса
    #39280508
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PupkinА хочу !!!
Перехоти. Точнее - обломись. У класса есть интерфейс и этот интерфейс - контракт между ним
и его пользователем. Всё, что не входит в интерфейс - для пользователя не существует.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Проверка существования члена класса
    #39280519
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pupkin,

В С++ рефлексии нет (почти нет).
Потому делай так
Код: plaintext
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.
26.
27.
28.
29.
30.
using namespace std;
#include <map>
#include <iostream>

class Example {
public:
    std::map<string, int> properties;
    Example() 
    {
        properties.insert({"aaa", 1});
        properties.insert({"bbb", 2});
    }
};

int main()
{
  Example obj;

  std::map<string, int>::iterator rc;
  if ((rc = obj.properties.find("aaa")) != obj.properties.end())
  {
	int x = obj.properties["aaa"];  // вар.1
	int y = rc->second;  // вар.2
	cout << "There is [aaa] field: == " << x << endl;
  }
  if ((rc = obj.properties.find("zzz")) == obj.properties.end())
  {
	cout << "There is no [zzz] field" << endl;
  }
}
...
Рейтинг: 0 / 0
Проверка существования члена класса
    #39280564
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PupkinЗадумайтесь. У Вас есть хедер файлы для TForm, TButton и т.п.?конечно, в каталог include установленного компилятора что мешает заглянуть?
...
Рейтинг: 0 / 0
Проверка существования члена класса
    #39280572
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возможно автору поможет dynamic_cast или type_id ?
...
Рейтинг: 0 / 0
Проверка существования члена класса
    #39280742
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PupkinА как называется член, где TForm хранит свой Top (например).
Могу догадываться, что в FTop, но наверняка не знаю. А хочу !!!Опять же: допустим, мы можем посмотреть список переменных класса, но что нам это даёт? Допустим, даже если они открыты? Мы видим переменную FTop, а как мы поймём её смысл в функционале класса? По названию нельзя, назвать автор мог их каким угодно способом.

И вообще к таким вопросам лучше подходить как можно абстрактнее. Подход к коду с точки зрения "нормального человека" чреват многими проблемами. Другими словами, программа делает то, что делает, а не то, что хотел программист, её написавший. Понимание этой разницы избавляет от таких попыток понять, что там внутри.
...
Рейтинг: 0 / 0
Проверка существования члена класса
    #39280749
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PupkinDimitry Sibiryakov

А если если ты их объявил, а мне не сказал. Тогда как?

Тогда будет ошибка компиляции, и ты узнаешь.
...
Рейтинг: 0 / 0
Проверка существования члена класса
    #39280768
Владимир2012
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PupkinЗадумайтесь. У Вас есть хедер файлы для TForm, TButton и т.п.?
А как называется член, где TForm хранит свой Top (например).
Могу догадываться, что в FTop, но наверняка не знаю. А хочу !!!До этого C++ еще "не дорос".
Из *.h программист может узнать только наличие методов, ... - и не больше.
Вы же хотите знать нечто больше типа "Какую функцию нужно использовать для обеспечения такой то функциональности?".
Для это нужны некие мета данные.
См. в сторону OLE ... или посмотрите что-то типа:
Создание категория параметров https://msdn.microsoft.com/ru-ru/library/bb166176.aspx

PS: Погуглите запросами типа "MSDN COM категория"
В Microsoft ребята "не глупые" и идут похожим "на правду" путем ...
...
Рейтинг: 0 / 0
Проверка существования члена класса
    #39280853
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Автор очень интересно начал но привел через несколько постов
просто неудачный пример с формами и батонами. Дейстительно - топчи
документацию по UI и найдешь то что тебе нужно.
...
Рейтинг: 0 / 0
Проверка существования члена класса
    #39470846
Pupkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry SibiryakovPupkinА хочу !!!
Перехоти. Точнее - обломись. У класса есть интерфейс и этот интерфейс - контракт между ним
и его пользователем. Всё, что не входит в интерфейс - для пользователя не существует.
У класса кроме интерфейса есть и другие "всякие штучки".
Если компилятор это умеет знать, то это возможно и я тоже хочу это уметь.
Знать - хочу, обламываться - не хочу!

egorychPupkinЗадумайтесь. У Вас есть хедер файлы для TForm, TButton и т.п.?конечно, в каталог include установленного компилятора что мешает заглянуть?Да ничо не мешает.
Только научите по какому критерию можно догадаться, что открыть (программно) нужно именно "инклюд"?
И каком файле (из более тысячи (не считая вложенных папок)) живет требуемая хотимость?

CEMbPupkinА как называется член, где TForm хранит свой Top (например).
Могу догадываться, что в FTop, но наверняка не знаю. А хочу !!!Опять же: допустим, мы можем посмотреть список переменных класса, но что нам это даёт? Допустим, даже если они открыты? Мы видим переменную FTop, а как мы поймём её смысл в функционале класса? По названию нельзя, назвать автор мог их каким угодно способом....

...мы можем посмотреть список переменных класса, но что нам это даёт? Что это дает Вам - это Ваши проблемы. А что это дает мне - находится в моем функционале.
Не нужно обсуждать не спрашиваемое.
Если Вы допустим можете посмотреть список переменных класса, то допустите и расскажите как. Я это и прошу.

Владимир2012PupkinЗадумайтесь. У Вас есть хедер файлы для TForm, TButton и т.п.?
А как называется член, где TForm хранит свой Top (например).
Могу догадываться, что в FTop, но наверняка не знаю. А хочу !!!До этого C++ еще "не дорос".
Из *.h программист может узнать только наличие методов, ... - и не больше.
Вы же хотите знать нечто больше типа "Какую функцию нужно использовать для обеспечения такой то функциональности?".
Для это нужны некие мета данные.
См. в сторону OLE ... или посмотрите что-то типа:
Создание категория параметров https://msdn.microsoft.com/ru-ru/library/bb166176.aspx

PS: Погуглите запросами типа "MSDN COM категория"
В Microsoft ребята "не глупые" и идут похожим "на правду" путем ..."C++" - то как раз дорос (как выясняется)! Не доросла квалификация (но растет (пока)).
Тут (выше) мне подсказали...
maytonВозможно автору поможет dynamic_cast или type_id ?
Не помогло, но на идею навело, спасибо автору.
dynamic_cast и type_id из RTTI, а там много "вкусного".

В общем реализовал две функции:

GetComponentProperties возвращает для класса список имен свойств и типов свойств,
PropertyExists возвращает существование свойства по имени в классе
Код: plaintext
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.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
//---------------------------------------------------------------------------
#include <typeinfo.h>

int __fastcall GetComponentProperties(TComponent *component,
    TStrings *sl,bool withClassName/*=0*/)
{
  int count = GetTypeData((PTypeInfo)component->ClassInfo())->PropCount;
  if(count)
  {
    PPropList pl = PPropList(new int[count]);
    try
    {
      GetPropInfos((PTypeInfo)component->ClassInfo(), pl);
      for(int i=0;i<count;++i)
      {
        PPropInfo pi = pl[i];
        if(!pi) break;
        String s=pi->Name;
        if(withClassName)s+=":"+(*(pi->PropType))->Name;
        sl->Add(s);
      }
    } __finally{delete[] pl;}
  }
  return count;
}
//------------------
bool __fastcall PropertyExists(TComponent *component,String propName)
{
  TStringList *sl=new TStringList();
  int v=GetComponentProperties(component,sl);
  if(v)v=sl->IndexOf(propName)+1; //my be -1
  delete sl;
  return v;
}
//---------------------------------------------------------------------------
...
Рейтинг: 0 / 0
Проверка существования члена класса
    #39470927
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PupkinУ класса кроме интерфейса есть и другие "всякие штучки".
Если компилятор это умеет знать, то это возможно и я тоже хочу это уметь.
Знать - хочу, обламываться - не хочу!В рантайме у класса вообще ничего нет, кроме указателя на таблицу виртуальных методов и блока данных, в котором есть некая структура, о которой известно лишь компилятору. Если на этапе компиляции bcc сказал, что такого мембера нет, то либо его нет, либо он закрыт для той области определения, в которой ты пытаешься получить к нему доступ.

Ты не мудри, а объясни по человечески суть задачи - занафига тебе знать какие и где мемберы объявлены.
...
Рейтинг: 0 / 0
Проверка существования члена класса
    #39470940
Фотография ну я
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pupkin
Не помогло, но на идею навело, спасибо автору.
dynamic_cast и type_id из RTTI, а там много "вкусного".

В общем реализовал две функции:

GetComponentProperties возвращает для класса список имен свойств и типов свойств,
PropertyExists возвращает существование свойства по имени в классе

Приговор:
В изначальной постановке
Код: plaintext
1.
2.
3.
4.
private:
  int aaa;
protected:
  int bbb;
нет пропертей.
...
Рейтинг: 0 / 0
Проверка существования члена класса
    #39470989
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Pupkinegorychпропущено...
конечно, в каталог include установленного компилятора что мешает заглянуть?Да ничо не мешает.
Только научите по какому критерию можно догадаться, что открыть (программно) нужно именно "инклюд"?
И каком файле (из более тысячи (не считая вложенных папок)) живет требуемая хотимость?
Не помню, как в вашем С++Builder, но в современных IDE можно либо кликнуть по TForm, зажав Ctrl, либо из меню по правой кнопке выбрать "Перейти к объявлению" и попасть прямо в нужный .h файл.
...
Рейтинг: 0 / 0
Проверка существования члена класса
    #39471049
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BarloneНе помню, как в вашем С++Builder, но в современных IDE можно либо кликнуть по TForm, зажав Ctrl, либо из меню по правой кнопке выбрать "Перейти к объявлению" и попасть прямо в нужный .h файл.В Borland C++ builder 6.0 это, также, возможно. Достаточно, к примеру, нажать правой кнопкой мыши на имя класса (TForm) и во всплывающем меню выбрать "Find declaration".
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Проверка существования члена класса
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]