Предположим, у меня есть следующий код, реализованный в Itcl.
package require Itcl
itcl::class A {
constructor {} { puts $this }
destructor {}
public method Print {} { puts "ok" }
}
itcl::class B {
constructor {} { }
destructor {}
public method returnA {} { return [A #auto] }
}
B b ;# create an instance of class B
set obj [b returnA] ; #assign return value to obj
$obj Print ;# should treat obj as an A type and print ok
Теперь я получаю следующую ошибку:
недопустимое имя команды "0"
при выполнении
"$ obj Print"
Я понял, что мне нужно добавить области к моей переменной или к команде Print, чтобы вызвать метод Print, связанный с классом A. Но я действительно не знаю как.
Я также прочитал следующий пост:
Как получить ссылку на переменную члена класса Itcl?
Но там не говорится, как рассматривать возвращаемое значение как переменную определенного типа класса.
Кроме того, приведенный выше фрагмент не является MVE ... пожалуйста. уделите этому больше внимания.
mrcalvin, мне нужно предоставить tcl-C++ API, и я читал, что использование Itcl - лучшее решение. Вы рекомендуете вместо этого использовать TclOO? где я могу прочитать об этом?
Каков ваш источник информации о Itcl и C++? Лучше всего обратиться к comp.lang.tcl, чтобы получить отзывы о выборе технологий для вашего приложения.
Вы должны указать имя еще не созданного экземпляра класса A
:
A [namespace current]::#auto
В противном случае имя созданного объекта возвращается неквалифицированным образом (0
, a0
, ...), что не может быть разрешено в команду Tcl для области действия вызывающего returnA
.
См. Также groups.google.com/forum/#!topic/comp.lang.tcl/3zh3JOi3iWo
Ответьте на один вопрос: зачем вы тренируетесь на Itcl? Почему бы не использовать
TclOO
, встроенную объектно-ориентированную систему, поставляемую с Tcl 8.6. Кстати. более новые версии ITcl построены на основе TclOO, так что от этого мало что можно получить, особенно если вы начинаете работать с Tcl (и вы не привязаны к ITcl).