Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Доступ к экземпляру из другой структуры  (Прочитано 10133 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Sacren
Новенький

by
Offline Offline

« : 19-12-2011 19:00 » 

У меня тупой вопрос. Как обратиться к свойству экземпляра структуры или класса из другого класса? Гугл/Яндекс не помогли.

То есть...

Здесь я храню информацию о классах брони

Код:
Public Structure ArmorClassItem
Public Title As String
Public Value As Single
Public Price As Integer
Public RequireLevel As Integer
Public Description As String
Public DescriptionValue As String
End Structure

Public defArmorClass(ArmorClassMax) As ArmorClassItem

Для обновления параметров персонажа соответственно требуется доступ к defArmorClass(ArmorClass).Value из структуры персонажа
Код:
Public Structure player
    Public Name As String

    Public Race As String

    Public Rating As Integer

    Public Health As Single
    Public Damage As Single
    Public ArmorBlock As Single

    Public Defence As Single
    Public ArmorClass As Integer'<=========это определяет какой класс брони нам нужен

    Public Attributes As player_attributes

    Public Sub UpdateStats()
        Health = Attributes.Endurance * 5
        Defence = Convert.ToSingle(Attributes.Dexterity + 0.3 * Attributes.Endurance)
        Damage = Convert.ToSingle(Attributes.Strength + 0.3 * Attributes.Dexterity)

            ArmorBlock = defArmorClass(ArmorClass).Value * Defence'<=========================вот оно
    End Sub

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

На выходе
Цитата
Reference to a non-shared member requires an object reference.
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 19-12-2011 19:24 » 

Через переменную, в которой хранится объект (экземпляр) класса. Через сам класс можно обращаться только к статическим членам.

Соответственно, сначала объект где-то должен быть создан (под него выделена память), и только потом с ним можно будет работать.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Sacren
Новенький

by
Offline Offline

« Ответ #2 : 19-12-2011 19:58 » 

Сделал
Код:
Public Shared defArmorClass() As ArmorClassItem

и теперь ReDim'ю его в процедуре инициализации, однако не нравятся ему мои shared'ы, т.к.
Цитата
Access of shared member, constant member, enum member or nested type through an instance; qualifying expression will not be evaluated.

Warning лучше чем Error, но всё же.

Мне ведь нужно значение конкретного экземпляра, а не вообще любой value из любого instance'а этой структуры.

А VS предлагает заменить как раз на ArmorClassItem, чтобы
Код:
MyClass.ArmorBlock = ArmorClassItem.Value * Defence

Но тогда я не получу необходимы мне значения.
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 19-12-2011 20:39 » 

Цитата: MSDN
Sharing a member of a class or structure makes it available to every instance, rather than nonshared, where each instance keeps its own copy.

Sacren, я так и не понял, что тебе надо. Если нужны разные экземпляры - создавай их и работай с их членами. Если не нужны - создавай shared-члены в классе и работай с ними через класс.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Sacren
Новенький

by
Offline Offline

« Ответ #4 : 19-12-2011 20:45 » 

Мне надо прочитать значения defArmorClass из player. Я не понимаю как этого добиться, а shared даёт warning Access of shared member, constant member, enum member or nested type through an instance; qualifying expression will not be evaluated.

Цитата
Соответственно, сначала объект где-то должен быть создан (под него выделена память), и только потом с ним можно будет работать.
Цитата
Public defArmorClass(ArmorClassMax) As ArmorClassItem
Это не создание?


Добавлено через 5 минут и 2 секунды:
Ладно, буду передавать значение через параметр, например myPlayer.UpdateStats(defArmorClass(myPlayer.ArmorClass))
Хотелось этого избежать и считать всё внутри.
« Последнее редактирование: 19-12-2011 20:50 от Sacren » Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 20-12-2011 09:00 » new

Sacren, player у тебя - это класс (структура). А ты сам же говоришь, что читать тебе надо из экземпляра. Где у тебя экземпляр класса?

Цитата: Sacren
Это не создание?
Это функция, которая возвращает экземпляр класса ArmorClassItem. А где экземпляр класса player? Где у тебя в коде вообще оператор New, который создаёт объекты?
« Последнее редактирование: 20-12-2011 09:02 от Dimka » Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Sacren
Новенький

by
Offline Offline

« Ответ #6 : 20-12-2011 17:42 » 

Спасибо.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines