Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Фатальное непонимание. 
:(
    Опции темы
smartchecker
Дата 4.10.2013, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 28.4.2012

Репутация: нет
Всего: нет



В аттаче зависимость объектов.
Хочу в объекте B иметь ссылку на объект A, а получаю независимую копию объекта А.
Проясните суть.
Объекты самописные.

Присоединённый файл ( Кол-во скачиваний: 12 )
Присоединённый файл  objects.png 4,60 Kb
PM MAIL   Вверх
Stolzen
Дата 4.10.2013, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1041
Регистрация: 17.10.2005

Репутация: 23
Всего: 48



Покажите лучше код


--------------------
datatalks.ru - анализ данных, статистика, машинное обучение
PM MAIL WWW   Вверх
smartchecker
Дата 4.10.2013, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 28.4.2012

Репутация: нет
Всего: нет



Цитата(Stolzen @ 4.10.2013,  17:23)
Покажите лучше код

Ну как-то так...
Код

        Stack triadStack = new Stack();
        triadList = new ArrayList<Triad>();
        Operand ops[];
        Triad linkedTriad;
// cut
                    ops = new Operand[2];
                    for (int i = 1; i >= 0; i--) {
                        if (triadStack.lastElement().getClass().isAssignableFrom(Triad.class)) {
                            linkedTriad = (Triad) triadStack.pop();
                            ops[i] = new Operand(linkedTriad);
                            ops[i].setLink(triadList.indexOf(linkedTriad));
                        } else if (triadStack.lastElement().getClass().isAssignableFrom(String.class)) {
                            ops[i] = new Operand((String)triadStack.pop());
                        }
                    }
                    triadList.add(new Triad(curT.getText(), ops));
                    triadStack.push(triadList.get(triadList.size() - 1));
// cut

И в другом месте я ожидаю что вот этот код вернёт мне индекс в ArrayList'е этого объекта
Код

            trd = triadList.get(i);
// cut
        triadList.indexOf(trd.getOp(j).getLinkedTriad())
// cut

PM MAIL   Вверх
smartchecker
Дата 5.10.2013, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 28.4.2012

Репутация: нет
Всего: нет



Причём в том месте, где ArrayList создаётся, судя по тому, что показывает debugger - всё происходит правильно.
А потом, когда я его в другом месте достаю что-то происходит не так.

Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  debug_01.png 80,44 Kb
PM MAIL   Вверх
smartchecker
Дата 5.10.2013, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 28.4.2012

Репутация: нет
Всего: нет



Так... Я всё понял. Я - идиот!  smile 
Я, кажется, про это уже спрашивал.
Проблема в этом коде
Код

        ArrayList<Triad> afterFoldingTriadList = new ArrayList<Triad>();

        for (Triad t : triadList) {
            afterFoldingTriadList.add(t.copy());
        }

Т.е. я хочу получить копию ArrayList'а и, очевидно, получаю не совсем то, что ожидаю.
Вопрос - как получить копию с нужным мне поведением?

Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  debug_01.png 80,44 Kb
PM MAIL   Вверх
Stolzen
Дата 5.10.2013, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1041
Регистрация: 17.10.2005

Репутация: 23
Всего: 48



Попробуйте убрать copy и оставить только t


--------------------
datatalks.ru - анализ данных, статистика, машинное обучение
PM MAIL WWW   Вверх
smartchecker
Дата 5.10.2013, 20:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 28.4.2012

Репутация: нет
Всего: нет



Цитата(Stolzen @ 5.10.2013,  16:03)
Попробуйте убрать copy и оставить только t

Тогда результирующий ArrayList смотрит на те же объекты(см. аттач), а мне нужны идентичние, но независимые копии.

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  debug_03.png 23,02 Kb
PM MAIL   Вверх
Pawl
Дата 6.10.2013, 08:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 649
Регистрация: 22.4.2008
Где: Витебск

Репутация: 7
Всего: 28



А  как вообще работает ваш метод t.copy()? В коде, пожалуйста.


--------------------
В действительности всё совсем не так, как на самом деле
PM MAIL   Вверх
smartchecker
Дата 6.10.2013, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 28.4.2012

Репутация: нет
Всего: нет



Цитата(Pawl @ 6.10.2013,  08:39)
А  как вообще работает ваш метод t.copy()? В коде, пожалуйста.

Ну как-то так

Код

    public Triad(Triad origTriad) {
        operation = origTriad.operation;
        trd_const = origTriad.trd_const;
        constVal = origTriad.constVal;
        ops = new Operand[origTriad.ops.length];
        refCount = origTriad.refCount;

        for (int i = 0; i < origTriad.ops.length; i++) {
            ops[i] = new Operand(origTriad.ops[i]);
        }
    }

    public Triad copy() {
        return new Triad(this);
    }

Код

    public Operand(Operand origOper) {
        value = origOper.value;
        opType = origOper.opType;
        opConst = origOper.opConst;
        link = origOper.link;
        constValue = origOper.constValue;
        linkedTriad = origOper.linkedTriad;
    }

    public Operand copy() {
        return new Operand(this);
    }

Я не знаю как присвоить правильный адрес объекту linkedTriad.
Поэтому он остаётся старым.
PM MAIL   Вверх
Pawl
Дата 6.10.2013, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 649
Регистрация: 22.4.2008
Где: Витебск

Репутация: 7
Всего: 28



Цитата(smartchecker @  6.10.2013,  11:18 Найти цитируемый пост)
Я не знаю как присвоить правильный адрес объекту linkedTriad.

Честно говоря, не понял, зачем реализовывать метод 
Код

    public Triad copy() {
        return new Triad(this);
    }

если потом вы в конструкторе public Operand(Operand origOper) потом все-равно присваиваете переменной linkedTriad ссылку на уже существующий объект класса Triad? Я имею ввиду оператор linkedTriad = origOper.linkedTriad; Может, лучше сделать так: linkedTriad = origOper.linkedTriad.copy()? А вообще, трудновато разобраться с куском большого проекта. Может, вам лучше упростить свой код до предела, чтобы локализовать проблему?

Это сообщение отредактировал(а) Pawl - 6.10.2013, 15:11


--------------------
В действительности всё совсем не так, как на самом деле
PM MAIL   Вверх
smartchecker
Дата 6.10.2013, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 48
Регистрация: 28.4.2012

Репутация: нет
Всего: нет



Цитата(Pawl @ 6.10.2013,  15:10)
Может, лучше сделать так: linkedTriad = origOper.linkedTriad.copy()?

Так будет безвылазная рекурсия.
PM MAIL   Вверх
Pawl
Дата 6.10.2013, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 649
Регистрация: 22.4.2008
Где: Витебск

Репутация: 7
Всего: 28



Цитата(smartchecker @  6.10.2013,  17:39 Найти цитируемый пост)
Так будет безвылазная рекурсия.

Тогда однозначно упрощай задачу и выкладывай код сюда. Потому что однозначно код
Код

linkedTriad = origOper.linkedTriad;

просто присваивает переменной linkedTriad ссылку на объект, который уже есть в объекте origOper, а не создает копию этого объекта.


--------------------
В действительности всё совсем не так, как на самом деле
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0887 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.