Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 31.08.2013
Сообщений: 56

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

08.12.2013, 21:55. Показов 1034. Ответов 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
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
08.12.2013, 22:26
Цитата Сообщение от art538 Посмотреть сообщение
ничего не выходит. Объясните, пожалуйста, как пользоваться подобной переменной, если можно, поясните примером.
Откуда вызываешь код? Прежде чем обращаться к члену b, нужно его создать
Visual Basic
1
Set Item.b = New Class1
1
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38167 / 21102 / 4307
Регистрация: 12.02.2012
Сообщений: 34,690
Записей в блоге: 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
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 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
38167 / 21102 / 4307
Регистрация: 12.02.2012
Сообщений: 34,690
Записей в блоге: 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
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 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
38167 / 21102 / 4307
Регистрация: 12.02.2012
Сообщений: 34,690
Записей в блоге: 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
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 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
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 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
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 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
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
YAFU@home — распределённые вычисления для математики. На CPU
Programma_Boinc 20.01.2026
YAFU@home — распределённые вычисления для математики. На CPU YAFU@home — это BOINC-проект, который занимается факторизацией больших чисел и исследованием aliquot-последовательностей. Звучит. . .
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru