6 / 6 / 0
Регистрация: 12.01.2010
Сообщений: 11
1

Доступ к объекту, который является свойством другого объекта

12.01.2010, 21:21. Показов 1732. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, у меня следующая проблема.
Есть класс Test_class.
Одним из свойств этого класса является динамический массив объектов класса Question_class - Questions().
Visual Basic
1
2
3
Private Questions() As Question_class   
Private Quantity As Integer 
Private Name As String
Необходимо в подпрограмме, которая использует объект Test_class обеспечить доступ к элементам массива Questions().
Пробовал объявить массив Questions() как Private, а не как Public, но при компиляции выбивает ошибку: Compile Error: Constants, Fixed Length strings, arrays, user-defined types not allowed as Public Members of object modules.
Также пытался использовать функцию ObjPtr, чтобы вернуть указатель на объект. Однако при запуске программе пишет Run-time Error '438'. Object doesn't support this property or method.
Visual Basic
1
2
3
4
5
Public Function AddNextQuestion() As Long 
ReDim Preserve Questions(Quantity + 1) 
AddNextQuestion = ObjPtr(Questions(Quantity)) 
Quantity = Quantity + 1 
End Function
Код в функции, в которой создан объект.
Visual Basic
1
2
3
Dim x As New Test_class
Dim d As New Question_class
d = x.AddNextQuestion()
Может ли кто-то посоветовать, как получить доступ к объекту, который является свойством другого объекта. Спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.01.2010, 21:21
Ответы с готовыми решениями:

Доступ к элементам массива, который является свойством обьекта
var ob = { id_type: , condition: , value: } //для функции обратного вызова...

[WPF] Вызывающий поток не может получить доступ к данному объекту, т.к. владельцем этого объекта является другой поток
Здравствуйте пытаюсь реализовать кросспоточное пополнение listbox в WPF С#, но и в итоге получаю...

Ошибка: вызывающий поток не может получить доступ к данному объекту, так как владельцем этого объекта является другой поток.
Ошибка в "progressBar1.Value += 50;", вызывающий поток не может получить доступ к данному объекту,...

Не работает свяка моего DependencyProperty со свойством другого объекта
Создаю UserControl c DependencyProperty "CurrentNumber" <UserControl...

7
1161 / 288 / 23
Регистрация: 28.09.2008
Сообщений: 553
13.01.2010, 01:21 2
Я может не совсем понимаю, но по-моему проблема в том, что сам объект не создаётся в классе, т.е. что делает функция AddNextQuestion? Она увеличивает массив, но новому элементу массива ничего не присваивает! Т.е. элемент массива, указатель на который пытаемся вернуть, равен Nothing, соответственно видимо поэтому и не можем получить указатель. Ибо указывать ни на что vb видимо не умеет (и подозреваю, что не только vb). Это раз. А два - это метод AddNextQuestion возвращает тип Long, а присвоить это значение ты пытаешься переменной d. Посмотри внимательно, какого типа ты её объявляешь. Вообще мало понятно, что именно требуется от кода. Но если нужен указатель на вновь созданный экземпляр класса Question_class, то примерно как-то так:
Visual Basic
1
2
3
4
5
6
Public Function AddNextQuestion() As Long
ReDim Preserve Questions(Quantity)
Set Questions(Quantity) = New Question_class
AddNextQuestion = ObjPtr(Questions(Quantity))
Quantity = Quantity + 1
End Function
а позырить указатель на объект можно так
Visual Basic
1
2
3
4
Dim x As New Test_class
Dim d As Long
d = x.AddNextQuestion()
MsgBox d
А вообще фиг знает, у меня с классами практики мало. А то что динамический массив низя объявить, как Public - это да.
1
6 / 6 / 0
Регистрация: 12.01.2010
Сообщений: 11
13.01.2010, 11:08  [ТС] 3
Спасибо, Abu.
А как получить доступ к свойствам и методам класса через этот указатель?
P.S. Программирую на vb6.
0
1161 / 288 / 23
Регистрация: 28.09.2008
Сообщений: 553
13.01.2010, 18:55 4
Цитата Сообщение от kornet Посмотреть сообщение
А как получить доступ к свойствам и методам класса через этот указатель?
Зачем через указатель-то? Если нужно просто обращаться к методам одного класса через другой, то всё тоже самое. Вот пример небольшой:
Visual Basic
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
'модуль класса Question_Class
Private objName As String
'допустим у каждого экземляра будет своё имя
Private Hey_You As Long
'и каждый экземпляр будет считать количество обращений к себе
 
Private Sub Class_Initialize()
Dim i As Integer
Randomize
For i = 0 To 4
    objName = objName & Chr(CLng(Rnd * 25 + 97))
Next i
End Sub
'придумаем случайное имя экземляру класса при его создании
 
Public Sub ObjClick()
Hey_You = Hey_You + 1
End Sub
'процедура запоминаня количества обращений к объекту
 
Public Function GetName() As String
GetName = objName
End Function
'соответственно научим класс сообщать своё имя
 
Public Function GetHey() As Long
GetHey = Hey_You
End Function
'и сообщать сколько раз его кликали
'**************************************************
'модуль класса Test_Class
Private Questions() As Question_Class
Private Quantity As Integer 'размер массива
Private Position As Integer 'текущий элемент
 
Private Sub Class_Initialize()
Quantity = -1
Position = -1
End Sub
 
Public Property Get CurIndex() As Integer
CurIndex = Position
End Property
 
Public Property Let CurIndex(ByVal vNewValue As Integer)
Position = vNewValue
End Property
 
Public Sub AddNextQuestion()
Quantity = Quantity + 1
ReDim Preserve Questions(Quantity)
Set Questions(Quantity) = New Question_Class
Position = Quantity
End Sub
 
Public Function CurQuestion() As Question_Class
If Position > -1 Then
    Set CurQuestion = Questions(Position)
Else
    MsgBox "Массив не заполнен!", , ""
End If
End Function
'**************************************************
'модуль формы, на форме три кнопки и листбокс для удобства
Dim t As New Test_Class
 
Private Sub Form_Load()
Command1.Caption = "Add element"
Command2.Caption = "Get Name"
Command3.Caption = "Get Hey"
End Sub
 
Private Sub Command1_Click()
t.AddNextQuestion
List1.AddItem "one instance"
End Sub
 
Private Sub Command2_Click() 'проверяем, если элемент не пустой, то показываем имя
If Not t.CurQuestion Is Nothing Then MsgBox t.CurQuestion.GetName
End Sub
 
Private Sub Command3_Click() 'проверяем, если элемент не пустой, то показываем количество кликов
If Not t.CurQuestion Is Nothing Then MsgBox t.CurQuestion.GetHey
End Sub
 
Private Sub List1_Click()
t.CurIndex = List1.ListIndex
t.CurQuestion.ObjClick
End Sub
2
6 / 6 / 0
Регистрация: 12.01.2010
Сообщений: 11
13.01.2010, 21:03  [ТС] 5
Abu.
ДА! Оно работает! Спасибо большое! +1

Добавлено через 21 минуту
Но все жё остается вопрос. Если возвращать указатель на объект, то как получить доступ к методам и свойствам этого объекта через указатель? Спасибо.
0
1161 / 288 / 23
Регистрация: 28.09.2008
Сообщений: 553
14.01.2010, 02:58 6
Цитата Сообщение от kornet Посмотреть сообщение
Если возвращать указатель на объект, то как получить доступ к методам и свойствам этого объекта через указатель?
Фиг знает. А тебе это зачем? Скажи какую цель преследуешь, я поищу.
0
6 / 6 / 0
Регистрация: 12.01.2010
Сообщений: 11
14.01.2010, 14:40  [ТС] 7
Цитата Сообщение от Abu Посмотреть сообщение
Фиг знает. А тебе это зачем? Скажи какую цель преследуешь, я поищу.
Для удобства и сокращения кода.
Я разрабатываю программу, которая будет обрабатывать тесты управлять ими.
Класс Test_class включает в себя динамический массив Question_class, который содержит в себе все вопросы теста. Свойство Quantity класса Test_class отвечает за кол-во вопросов в тесте.
Метод AddNextQuestion() класса Test_class должен выделять память под очередной вопрос, увеличивать значение Quantity и возвращать указатель на очередной выделенный вопрос. Этот указатель хотелось бы присвоить переменной и при помощи этой переменной оперировать конкретным вопросом. Обращаться к методам этого конкретного вопроса придется не один раз.
Можно, в принципе, как ты посоветовал, отдельный метод класса Test_class создать, который будет просто возвращать последний созданный Question_class, но это усложнит код.
Спасибо за помощь.
0
1161 / 288 / 23
Регистрация: 28.09.2008
Сообщений: 553
16.01.2010, 15:14 8
Цитата Сообщение от kornet Посмотреть сообщение
Для удобства и сокращения кода.
Удобство, конечно, для каждого имеет своё понятие, но код ты этим врятли сократишь. Я вообще не понимаю, зачем тебе работать с классом через класс? Почему нельзя создать массив типа Question_class в модуле формы и оттуда с ним напрямую работать? Но раз нельзя - значит нельзя, пусть будет через промежуточный класс (может я и вправду не в курсе какой-то простой истины). В прилепленных есть статья, там как раз про указатели. Кстати, указатели в vb, насколько мне известно, существуют для работы с API функциями. А так они нафиг не нужны, зачем работать через указатель, когда ты можешь объявить переменную этого типа и к ней обращаться. В общем, если я всё правильно поняла, то указатели - это не твой случай. Если ошибаюсь - объясни в чём.
0
16.01.2010, 15:14
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.01.2010, 15:14
Помогаю со студенческими работами здесь

Доступ к объекту из другого класса
Перебрав кучу топиков и ссылок, так и не нашел решения для себя... Может кто подскажет, как...

Доступ к объекту ui из другого класса
Всем привет! Из другого класса необходимо обратиться к объекту ui (textEdit) и что-нибудь вывести...

Доступ к объекту из другого потока
Привет, подскажите, как исправить ошибку private void button1_Click(object sender,...

Доступ к объекту другого потока
Доброго времени суток. Помогите, пожалуйста, с задачей. У меня есть форма. Я создаю поток и в нем...


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

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

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