0 / 0 / 0
Регистрация: 31.08.2013
Сообщений: 56

Переменная в объявлении класса с типом класса

08.12.2013, 21:55. Показов 1071. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Разбираю исходник из книги. Столкнулся с такой проблемой: есть модуль класса (Class1), в нём объявляется несколько переменных стандартных типов (variant, integer и т.д.) и переменная типа самого класса
Visual Basic
1
2
Public a As Variant
Public b As Class1
С подобным объявление сталкиваюсь впервые, никак не могу разобраться для чего нужна такая переменная и как ей пользоваться. Пробовал так:
Visual Basic
1
2
Set Item = New Class1
Item.b.a = Text1.Text
ничего не выходит. Объясните, пожалуйста, как пользоваться подобной переменной, если можно, поясните примером.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.12.2013, 21:55
Ответы с готовыми решениями:

Создание экземпляра класса-наследника для переменной с типом базового класса
Подскажите чайнику как создается экземпляр класса BC BaseClass BC = new DerivedClass(); Вопрос: BC - это экземпляр класса BaseClass...

Что происходит когда передается в функцию базового класса аргумент с типом производного класса?
Есть функция перегруженного оператора"+" в производном классе и в базовом классе который принимает свой тип(базового класса) что...

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

14
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 79
08.12.2013, 22:26
Цитата Сообщение от art538 Посмотреть сообщение
ничего не выходит. Объясните, пожалуйста, как пользоваться подобной переменной, если можно, поясните примером.
Откуда вызываешь код? Прежде чем обращаться к члену b, нужно его создать
Visual Basic
1
Set Item.b = New Class1
1
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38203 / 21135 / 4310
Регистрация: 12.02.2012
Сообщений: 34,741
Записей в блоге: 14
09.12.2013, 19:56
art538, класс - это тип. Переменная "типа класс" - это объект. Если написано:

Visual Basic
1
  Dim b as Class1
значит переменная b есть ссылка на объект. Объект перед использованием нужно создать (оператором Set ... new):

Visual Basic
1
2
3
  Dim b as Class1
  '....
  Set b=New Class1
Создание объекта можно совместить с описанием:

Visual Basic
1
  Dim b as new Class1
Теперь переменной b можно "пользоваться" (менять свойства, вызывать методы).

Что написано у тебя:

Visual Basic
1
2
3
Set Item = New Class1  ' Item - объектная ссылка
Item.b.a = Text1.Text   ' обращение к свойству b (оно есть у Class1 ?).
                                ' Оно (судя по записи) само должно быть объектом и иметь свойство "a"...
1
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 79
09.12.2013, 19:59
Цитата Сообщение от Catstail Посмотреть сообщение
Создание объекта можно совместить с описанием
Visual Basic
1
Dim b as new Class1
Эта конструкция не создает объект. Это неравносильно
Visual Basic
1
2
3
  Dim b as Class1
  '....
  Set b=New Class1
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38203 / 21135 / 4310
Регистрация: 12.02.2012
Сообщений: 34,741
Записей в блоге: 14
09.12.2013, 20:03
Цитата Сообщение от The trick Посмотреть сообщение
Эта конструкция не создает объект. Это неравносильно
- строго говоря, да. Но вот это:

Visual Basic
1
2
3
4
  Dim b as Class1
  '...
  Set b=New Class1
  b.нечто=...
и это

Visual Basic
1
2
3
  Dim b as New Class1
  '...
  b.нечто=...
практически равносильно.
0
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 79
09.12.2013, 20:27
В данном примере это не имеет значения, но в дальнейшем ТС не сможет присвоить Nothing этой переменной, это как в примере:
Visual Basic
1
2
3
4
5
6
7
8
9
Dim Z As New Collection
    
Set Z = Nothing
   
If Z Is Nothing Then
        Stop        ' Это никогда не выполнится
    Else
        Stop        ' Это всегда выполнится
End If
Добавлено через 16 минут
Подробней Доступ к форме
1
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38203 / 21135 / 4310
Регистрация: 12.02.2012
Сообщений: 34,741
Записей в блоге: 14
09.12.2013, 21:18
The trick, и опять-таки да! Сам я никогда не использую форму Dim x as new ...
1
0 / 0 / 0
Регистрация: 31.08.2013
Сообщений: 56
11.12.2013, 15:19  [ТС]
Всем спасибо за ответы. Если я правильно понял, когда мы в окне основного кода пишем, например:
Visual Basic
1
 Dim obj1 As Class1
создаётся объектная переменная obj1, которая пока ничего не содержит.
Visual Basic
1
Set obj1 = New Class1
Эта инструкция создаёт новый экземпляр класса и помещает ссылку на него в переменную obj1. Я ничего не путаю? Если это так, можно как-нибудь посмотреть на саму ссылку, на какой участок памяти она ссылается?
0
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 79
11.12.2013, 15:27
Цитата Сообщение от art538 Посмотреть сообщение
Всем спасибо за ответы. Если я правильно понял, когда мы в окне основного кода пишем, например:
Visual Basic
1
 Dim obj1 As Class1
создаётся объектная переменная obj1, которая пока ничего не содержит.
Создается переменная, содержащая в себе ссылку на объект, а т.к. объект не существует, там содержится 0. Можно проверить:
Visual Basic
1
2
VarPtr(obj1) ' Адрес переменной не равен 0
ObjPtr(obj1) ' Ссылка на объект равен 0
Цитата Сообщение от art538 Посмотреть сообщение
Visual Basic
1
Set obj1 = New Class1
Эта инструкция создаёт новый экземпляр класса и помещает ссылку на него в переменную obj1. Я ничего не путаю? Если это так, можно как-нибудь посмотреть на саму ссылку, на какой участок памяти она ссылается?
Да. Ссылку на объект можно получить через ObjPtr(obj1), также можно получить еще много чего, например ObjPtr + &H20 можно узнать количество ссылок указывающих на объект, ObjPtr + &H34 начало глобальных переменных объекта и т.п.
3
0 / 0 / 0
Регистрация: 31.08.2013
Сообщений: 56
11.12.2013, 21:23  [ТС]
Можно поподробнее узнать, в чём принципиальная разница между кодом:
Visual Basic
1
Dim b as new Class1
и кодом
Visual Basic
1
2
Dim b as Class1
Set b=New Class1
Что в первом случае будет находиться в переменной b, если не ссылка на экземпляр класса? И почему этой переменной нельзя в дальнейшем присвоить Nothing?
0
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 79
11.12.2013, 21:26
Смотри ссылку выше давал же. Каждое явное обращение предваряется
Visual Basic
1
If Obj Is Nothing Then Set Obj = New Class
1
0 / 0 / 0
Регистрация: 31.08.2013
Сообщений: 56
12.12.2013, 18:39  [ТС]
Что такое DAN ссылка? Ничего подобного в сети не нашёл
0
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 79
13.12.2013, 08:22
Цитата Сообщение от art538 Посмотреть сообщение
Что такое DAN ссылка?
Declared As New
2
0 / 0 / 0
Регистрация: 31.08.2013
Сообщений: 56
14.12.2013, 22:45  [ТС]
Большое спасибо за доходчивое объяснение! Если можно, задам ещё пару вопросов. Наблюдатель в программе показывает, что переменной, содержащей DAN ссылку, присвоить значение Nothing можно без проблем. Но как только вновь обращаешься к этой переменной (например, чтобы посмотреть её значение), экземпляр класса создаётся по новой, и ссылка на него тут же помещается в переменную. Если я правильно понял, выглядит это так:
Visual Basic
1
2
3
4
5
6
7
8
Dim Z As New Collection
 
Set Z = Nothing  'Переменная обнуляется
If Z Is Nothing Then 'создаётся новый объект, ссылка на который записывается в переменную
        Stop        ' Поэтому, это никогда не выполнится
    Else
        Stop        ' Это всегда выполнится
End If
Это верно? Я ничего не путаю?
Второй вопрос. В чём разница между инструкцией
Visual Basic
1
If Z Is Nothing Then
и инструкцией
Visual Basic
1
If Z = Nothing Then
0
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 79
14.12.2013, 23:03
Цитата Сообщение от art538 Посмотреть сообщение
Это верно? Я ничего не путаю?
Да, при любом явном обращении создаеться объект. Но можно обратиться неявно и узнать, только это не к чему.
Цитата Сообщение от art538 Посмотреть сообщение
Второй вопрос. В чём разница между инструкцией
Visual Basic
1
If Z Is Nothing Then
и инструкцией
Visual Basic
1
If Z = Nothing Then
Так писать нельзя (как во втором случае).
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.12.2013, 23:03
Помогаю со студенческими работами здесь

Проверка в объявлении класса
Добрый день! почему нет темы для "очень начинающих"? =) не кидайте в меня тапками. Но у меня такой вопрос. Вот я создала отдельный...

Ошибка при объявлении класса
А в этом случае как быть?: Цель: создаю точки, вывожу список точек в ListBox (через класс). Вот структура для списка точек: ...

Инициализация членов в объявлении класса
В классе: class peltier { public: material p = material('p'); material n = material('n'); peltier(); ~peltier(void); };

Ошибка в объявлении класса (в конструкторе)
Я не могу разобраться с классами и конструкторами, в строчке Progect();// {numb=0; sum=0; date=;} всегда высвечивает ошибку,...

Найти ошибку в объявлении класса
в чём дело? #include <iostream> #include <string> using namespace std; class Division_by_zero { public: string...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

Новые блоги и статьи
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru