所以我有一个带有变量(x,y)的类AClass,以及一个应该将两个对象作为同一个类的参数的函数,计算它们的x和y,并返回具有计算值的类的新实例。
package AClass;
sub new {
my $class = shift;
my $x = shift;
my $y = shift;
my $self = {
x => $x,
y => $y
};
return bless($self, $class);
}
sub getX {
my $self = shift;
return $self->{'x'};
}
sub getY {
my $self = shift;
return $self->{'y'};
}
sub addition {
my ($c1, $c2) = @_;
return new AClass(
$c1->getX() + $c1->getX(),
$c1->getY() + $c2->getY()
);
}
my $a1 = AClass->new(6, 4);
my $a2 = AClass->new(4, 3);
my $val = AClass::addition(\$v1, \$v2);
say $val.getX();
我收到错误“无法调用方法”getX“on unblessed reference”。当我试图访问不是实数的对象的值时,我认为问题是另外的函数?
答案 0 :(得分:5)
这里有很多问题。
您使用的是$v1
和$v2
,大概是指$a1
和$a2
您正在将引用传递给这些对象,而不是对象本身
您的addition
方法会将$c1
的X值添加到自身而不是X
的值$c2
您正在使用字符串连接运算符.
而不是间接运算符->
最好使用小写字母作为词汇标识符。大写字母通常保留给包名称等全局字符
您必须总是 use strict
和use warnings
位于您的计划顶部。在这种情况下,您会收到$v1
和$v2
未被声明的事实的提醒。
此版本的代码可以正常使用
use strict;
use warnings;
package AClass;
sub new {
my $class = shift;
my ($x, $y) = @_;
bless { x => $x, y => $y }, $class;
}
sub get_x {
my $self = shift;
$self->{x};
}
sub get_y {
my $self = shift;
$self->{y};
}
sub addition {
my ($c1, $c2) = @_;
AClass->new(
$c1->get_x + $c2->get_x,
$c1->get_y + $c2->get_y
);
}
package main;
use feature 'say';
my $a1 = AClass->new(6, 4);
my $a2 = AClass->new(4, 3);
my $val = AClass::addition($a1, $a2);
say $val->get_x;
<强>输出强>
10
答案 1 :(得分:3)
您使用$v1
代替$a1
。始终使用use strict; use warnings;
。
此外,您无缘无故地参考了。
my $val = AClass::addition($a1, $a2);
以下内容也适用(尽管add
)是一个更好的词:
my $val = $a1->addition($a2);