Невозможно устранить ошибку. Цель вызова assigner не имеет связанной команды assigner в Eiffel.

В Eiffel Studio я пытался получить доступ к полям объекта класса, который я определил из другого класса. Однако он продолжает выдавать ошибки, которые я не могу понять и решить. Ниже приведен фрагмент кода примера:

Класс, в котором создается объект:

class
    TEST1

feature
    object: TEST2
        -- object of type TEST2
    function(val: INTEGER)
            -- Assign
        do
            object.value:=val
        end
end

Класс, объект которого создается:

class
    TEST2

feature 
    value: INTEGER
end

Сообщения об ошибках следующие:

Error code: VBAC(2)

Error: target of assigner call has no associated assigner command.
What to do: add an assigner mark to the declaration of the target feature or use a dot form of a call.

Class: TEST1
Feature: function
Line: 10
      do
->      object.value:=val
      end

а также

Error code: VEVI

Error: variable is not properly set.
What to do: ensure the variable is properly set by the correspondig setter instruction.

Class: TEST1
Source class: ANY
Feature: default_create
Attribute(s): object
Line: 331
      do
->    end

Кажется, что есть некоторая проблема с оператором присваивания. Тем не менее, я не смог понять, что не так.

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

Спасибо.


person GoodDeeds    schedule 04.11.2016    source источник


Ответы (1)


В Eiffel все атрибуты рассматриваются как доступные только для чтения. Это избавляет от необходимости создавать геттеры, как в других языках, таких как Java. Чтобы присвоить значение атрибуту с использованием синтаксиса ":=", вам понадобится присваиватель. Вот пример:

class
    TEST2

feature
    value:INTEGER assign set_value

    set_value(a_value:INTEGER)
        do
            value := a_value
        end
end

Затем вы сможете использовать строку:

object.value:=val

Что касается второй ошибки, по умолчанию EiffelStudio — это то, что мы называем Void Safe. Это механизм, который гарантирует, что атрибут, который не считается «отсоединяемым», никогда не будет недействительным (аналогично NULL в других языках). По умолчанию каждый класс имеет конструктор по умолчанию с именем default_create, и этот конструктор ничего не делает. Что вам нужно сделать, так это создать собственный конструктор в классе {TEST1}, который создает экземпляр каждого атрибута внутри него. Вот пример:

class
    TEST1

create
    make

feature
    make
        do
            create object
        end

    object: TEST2
        -- object of type TEST2
    function(val: INTEGER)
            -- Assign
        do
            object.value:=val
        end
end

В предыдущем примере я создал вызов метода make, указав, что метод является конструктором, и в этом методе я удостоверился, что атрибут объекта правильно создан.

person Louis M    schedule 04.11.2016
comment
Спасибо. Я не знал об этом. Однако это изменение исправляет только первую ошибку. Подскажите, пожалуйста, в чем причина второй ошибки и как ее исправить? - person GoodDeeds; 04.11.2016
comment
Извините, это вылетело из головы. Я редактирую свой ответ, чтобы помочь вам с обеими ошибками. - person Louis M; 04.11.2016