Как правильно работать с объектом класса в другом классе?C++
Итак. Передача объекта класса Pri в класс Event происходит успешно. В ф-ии getter2 выводится правильный адрес переданного объекта s1. При попытке разыменования (*obj) естесно происходит ошибка. Но и при вызове»(obj.getter()» происходит ошибка. Вопрос как правильно работать с объектом класса внутри другого? Как достучаться до его родных геттеров и при инициализации объекта «g» вывести на экран»12,21 : asdfa «?
Отслеживать
задан 12 ноя 2019 в 19:01
63 1 1 серебряный знак 8 8 бронзовых знаков
Как использовать один метод в другом классе?
и вот тут уже такое не работает, хотя схема применения та же самая.
В чем может быть дело?
ошибка там где применяется примерно такая
NullReferenceException: Object reference not set to an instance of an object
IAPSeller.InitializationLot (UnityEngine.Purchasing.Product p) (at Assets/Resources/Scripts/IAPSeller.cs:632)
.
- Вопрос задан более двух лет назад
- 179 просмотров
6 комментариев
Простой 6 комментариев

Василий Банников @vabka Куратор тега C#
Я в юнити не спец, но вроде экземпляр MonoBehaviour можно получить через GetComponent.
Ну и вы пытаетесь тут обратиться к instance до того как он проинициализируется.
Zimaell @Zimaell Автор вопроса
Василий Банников, тут инициализация самого класса идет а не используемого
public class CanvasBoard. . public static CanvasBoard instance; private void Awake()< instance = this; .
да и посмотрите на схему применения, она такая же. только вот 2 скрипт (1 вариант) работает, во 3 скрипт (2й равиант) нет.
То есть вроде так же все делаю, но там работает а там нет.

Василий Банников @vabka Куратор тега C#
Zimaell, и что?
DataStorage.instance видимо на момент обращения null.
Используйте что-то другое.
Zimaell @Zimaell Автор вопроса
Василий Банников, а с чего вдруг? Что его может обнулять?
хотя даже так вот пробовал
private DataStorage Di; public void Awake()< Di = DataStorage.instance; float l = Di.GetDataValue("Language");
NullReferenceException: Object reference not set to an instance of an object
чего там работает, тут не работает, все происходит на одной сцене, используются одни и те же объекты.

Василий Банников @vabka Куратор тега C#
Zimaell, и что тут поменялось? Где гарантия, что IAPSeller.Awake вызовется раньше, чем DataStorage.Awake?
Вообще из категории бреда - попробуйте переименовать IAPSeller чтобы он по алфавиту шёл перед DataStorage.
А вообще используйте лучше GetComponent
Zimaell @Zimaell Автор вопроса
хорошо прменяю в классе так
private void InitializationLot(Product p)< float l = DataStorage.instance.GetDataValue("Language");
не катит, хотя это уже после авейков идет.
Решения вопроса 1

GavriKos @GavriKos Куратор тега Unity
Последовательность вызовов эвейков - дело туманное и неопределенное.
Вы даете гарантию что Awake класса DataStorage вызовется раньше чем IAPSeller?
Ответ написан более двух лет назад
Нравится 2 4 комментария
Zimaell @Zimaell Автор вопроса
хорошо тогда я в классе IAPSeller в определенном методе применяю так
private void InitializationLot(Product p)< float l = DataStorage.instance.GetDataValue("Language");
иерархия объектов идет так
Main Camera
DataStorage
IAPSeller
то есть ну как бы должна быть уже инициализирована, но нет, нету ее.
Может как-то по другому её вызвать?

GavriKos @GavriKos Куратор тега Unity
Если хотите оставлять синглтоны - то просто настройте порядок эфейков. В юнити есть ScriptExecutionOrder - он вам и нужен
Zimaell @Zimaell Автор вопроса
GavriKos, на сколько я понял там можно установить порядок запуска скриптов, ну и тем самым мне например нужен первым делом нужен DataStorage , только вот как только я там нажимаю на "+" то есть добавить, мне ошибку типа
ArgumentException: An item with the same key has already been added. Key: Assets/Plugins/UnityPurchasing/Bin/Editor.dll.meta
System.Collections.Generic.Dictionary`2[TKey,TValue].TryInsert (TKey key, TValue value, System.Collections.Generic.InsertionBehavior behavior) (at :0)
System.Collections.Generic.Dictionary`2[TKey,TValue].Add (TKey key, TValue value) (at :0)
.
че опять то не так?
Zimaell @Zimaell Автор вопроса
лан вопрос снят, немного полазив по сети люди сказали - перетащи скрипт вручную, теперь все работает как нужно.
ура.
Как использовать метод из другого класса java
Чтобы использовать метод из другого класса его необходимо вызвать через объект этого класса или через имя класса, если метод статический.
// Класс, где вызываем методы другого класса public class Example public static void main(String[] args) // Создаем объект класса Greetings greetings = new Greetings(); // Вызываем метод greetings.printHello(); // => Hello // Вызываем статический метод Greetings.printHexlet(); // => Hexlet > > class Greetings public void printHello() System.out.println("Hello"); > public static void printHexlet() System.out.println("Hexlet"); > >
Как использовать один класс в другом с
Всем привет.
Не могу понять, как правильно реализовать использование объекта одного класса в другом классе.
class primer1< private: int i; public: primer1(int i) i=i;>; void set(int i) i=i;>; int get() ; >; class primer2< private: primer1 a; свои поля; public: свои методы; >; int main()< primer2 b; Тут мне необходимо обратится к методу set класса primer1. Т.е. в объекте b(класс primer2) хочу изменить значение его поля a(класс primer1). Как это правильно сделать в соответсвии всем правилам ООП? Представляю себе это так. Для решения задачи мне надо получить доступ к полю primer1 a; Вариант1) Сделать в классе primer2 метод primer1& geta() ;. Тогда будет в main типа b.geta().get(); b.geta().set(i); Вариант2) Вынести поле primer1 a; в public. Тогда всё и так понятно. Вариант3) Сделать в классе методы "дубли" типа int get() ; void set(int i) ;. return 0; >
Подскажите как это правильно делается.
Software Engineer
Участник клуба
Регистрация: 07.04.2007
Сообщений: 1,618
Вы не сможете к нему обратиться, т.к. переменная primer1 a объявлена с модификатором доступа private.
Можно сделать так:
class A < public: void Func(); . >; class B < public: A a; . >; int main()
А, извиняюсь, не дочитал вопрос.
Выбор из ваших трех вариантов зависит от конкретной задачи, от того, какие сущности представляют классы и вообще от общей структуры проекта. Так, в общем виде, трудно сказать. Но вообще, если вы помещаете объект в закрытый доступ, то и работать с ним должен только тот класс, в котором он объявлен, иначе он должен быть в открытом доступе
Мужество есть лишь у тех, кто ощутил сердцем страх, кто смотрит в пропасть, но смотрит с гордостью в глазах. (с) Ария
Последний раз редактировалось Blade; 06.05.2011 в 11:25 .