Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 如何将一个类的itcl对象传递给另一个类的对象,并使用传递的对象的函数?_Oop_Tcl_Itcl - Fatal编程技术网

Oop 如何将一个类的itcl对象传递给另一个类的对象,并使用传递的对象的函数?

Oop 如何将一个类的itcl对象传递给另一个类的对象,并使用传递的对象的函数?,oop,tcl,itcl,Oop,Tcl,Itcl,在namespace::NodeTypes中,我有一个类NodeType1和另一个类NodeType2的另一个对象 我还有一个类NetworkCollector和另一个类NodeType2的另一个对象 我需要将NodeType1和NodeType2的对象作为NetworkCollector对象中的参数传递,并在NetworkCollector类中使用传递的对象的函数 您能否建议一些可能的解决方案,如何将一个对象的引用传递给另一个类中的另一个方法以下示例代码无效: itcl::class ::No

在namespace::NodeTypes中,我有一个类NodeType1和另一个类NodeType2的另一个对象

我还有一个类NetworkCollector和另一个类NodeType2的另一个对象

我需要将NodeType1和NodeType2的对象作为NetworkCollector对象中的参数传递,并在NetworkCollector类中使用传递的对象的函数

您能否建议一些可能的解决方案,如何将一个对象的引用传递给另一个类中的另一个方法以下示例代码无效:

itcl::class ::NodeTypes::NodeType1 {
  private activeChannels 0;
  method addChannels {numChannels} {
      #set active channels
      set activeChannels $numChannels
  }   
      method getActiveChannels {} {
        # return number of channels being used in the NodeType1 object
        return $activeChannels
      }
}

itcl::class ::NodeTypes::NodeType2 {
  private activeChannels 0;
  method addChannels {numChannels} {
      #set active channels
      set activeChannels $numChannels
  }
  method getActiveChannels {} {
      # return number of channels being used in the NodeType2 object
      return $activeChannels
  }
}

::NodeTypes::NodeType2 NodeType2Object2

itcl::class ::NodeTypes:NetworkCollector {
  method getTotalUsedChannels {Node1 Node2} {
      set Node1Channels [Node1 getActiveChannels] 
      set Node2Channels [Node2 getActiveChannels] 
      set totalActiveChannels [$Node1Channels + $Node2Channels]
      puts "Total active channels are $totalActiveChannels"
  }   
}

#creating objects
::NodeTypes::NodeType1 NodeType1Object
::NodeTypes::NodeType2 NodeType2Object

#adding channels to nodes
NodeType1Object::addChannels 5 
NodeType2Object::addChannels 10

#calculating total active channels
::NodeTypes:NetworkCollector networkCollector1

networkCollector1 getTotalUsedChannels $NodeType1Object $NodeType2Object
问题:抛出错误------>无法读取“NodeType1Object”:没有这样的变量


请您提出一些可能的解决方案,如何将一个对象的引用传递给另一个类中的另一个方法。

愚蠢的事情是……您的代码几乎是正确的(据我所知)。您只需要知道,在Tcl中添加数字是通过
expr
命令完成的,并且在读取变量时,始终必须显式取消引用变量(即
$foo
确切地表示“读取变量
foo
的值”):

您也可以编写这样的方法:

method getTotalUsedChannels {Node1 Node2} {
    set numChans [$Node1 getActiveChannels] 
    incr numChans [$Node2 getActiveChannels] 
    puts "Total active channels are $numChans"
}
问题1 除了Donal所说的,由于直接从类调用
getTotalUsedChannels
,而不是任何对象的一部分,因此应该将其设置为
公共过程

public proc getTotalUsedChannels ....
而不是

method getTotalUsedChannels ....
这样调用它:

::NodeTypes:NetworkCollector::getTotalUsedChannels NodeType1Object NodeType2Object
问题2 而不是:

private activeChannels 0;
您需要关键字
变量

private variable activeChannels 0

好的。。解决办法很简单。。将美元符号$添加到过程中由ref传递的对象上-谢谢Donal i、 e

方法getTotalUsedChannels{Node1 Node2}{

设置Node1通道[$Node1 GetActiveChannel]

设置Node2通道[$Node2 GetActiveChannel]

private variable activeChannels 0
packa r Itcl
namespace eval NodeTypes {}
itcl::delete class NodeTypes::NodeType1
itcl::delete class NodeTypes::NodeType2
itcl::delete class NodeTypes::NetworkCollector
itcl::delete class NodeTypes::NodeBase


itcl::class NodeTypes::NodeType1 { 
  private variable activeChannels 0;

  method addChannels {numChannels} {
      #set active channels
      set activeChannels $numChannels
  }

  method getActiveChannels {} {
      # return number of channels being used in the NodeType1 object
      return $activeChannels
    }
}

itcl::class NodeTypes::NodeType2 { 
  private variable activeChannels 0;
  method addChannels {numChannels} {
      #set active channels
      set activeChannels $numChannels
  }
  method getActiveChannels {} {
      # return number of channels being used in the NodeType2 object
      return $activeChannels
  }
}


itcl::class NodeTypes::NetworkCollector {
  method getTotalUsedChannels {Node1 Node2} {
      set Node1Channels [$Node1 getActiveChannels] 
      set Node2Channels [$Node2 getActiveChannels] 
      set totalActiveChannels [expr $Node1Channels + $Node2Channels]
      puts "Total active channels are $totalActiveChannels"
  }   
}

#creating objects
NodeTypes::NodeType1 NodeType1Object
NodeTypes::NodeType2 NodeType2Object

#adding channels to nodes
NodeType1Object addChannels 9
NodeType2Object addChannels 10

#calculating total active channels
NodeTypes::NetworkCollector networkCollector1

networkCollector1 getTotalUsedChannels NodeType1Object NodeType2Object