2012-09-30 31 views
-8

這是一個面向對象Perl的問題。我應該設計一個模塊:
1)存儲值
2)計算總計,平均值,計數。
我應該在面向對象的Perl中找到一個涉及方法覆蓋或多態或繼承的代碼。模塊上的Perl - 繼承,多態

我的代碼是這樣的:

package Stats; 
use strict; 
use warnings; 
sub new { 
    my $class = @_; 
    my $self = {}; 
    bless $self, $class; 
    $self->clear(); 
    return $self; 
} 
sub clear { 
    my $self = $_[0]; 
    $self->{'numlist'} = undef; 
    $self->{'x_sum'} = 0; 
    $self->{'x2_sum'} = 0; 
} 
sub addValue { 
    my $self = $_[0]; 
    my $num = $_[1]; 
    if (defined $num) { 
    push @{$self->{'numlist'}}, $num; 
    $self->{'x_sum'} += $num; 
    $self->{'x2_sum'} += $num**2; 
    } 
} 
sub getTotal { 
    my $self = $_[0]; 
    return $self->{'x_sum'}; 
} 
sub getMean { 
    my $self = $_[0]; 
    my @numlist = @{$self->{'numlist'}}; 
    if ([email protected]) { return 0; } 
    return $self->getTotal()/@numlist; 
} 
sub getValueList { 
    my $self = $_[0]; 
    return @{$self->{'numlist'}}; 
} 
1; 


sub results { 
my $obj = new Stats(13,4,56,43,33); 
print "Number of values: ", scalar($obj->getValueList()), "\n"; 
print "Total: ", $obj->getTotal(), "\n"; 
print "Mean: ", $obj->getMean(), "\n"; 
} 

我要去哪裏錯了?

+6

您是否使用嚴格的'和使用警告?這將幫助你解決一些問題... – amon

+0

如果這是一個家庭作業問題,它應該被標記爲 – gcbenison

+1

@gcbenison錯誤,作業標記爲[*棄用*](http://meta.stackexchange.com/questions/ 147100/-Homework-tag-is-now-official-deprecated?cb = 1) – amon

回答

1

好的。您正在使用的對象的構造函數的語法是有點akward的話,我寧願

my $obj = Stats->new(13,4,56,43,33); 

在Perl,new不是一個普通的關鍵字,但一個簡單的分,而且應該這樣使用。 Foo->sub(@args)語法與Foo::sub('Foo', @args)完全相同,因此需要傳遞正確的類名稱並調用正確的new子。

然後,你應該使用你傳遞給你的Stats構造函數的數字。此構造應該做的伎倆:

sub new { 
    my ($class, @args) = @_; 
    my $self = {}; 
    bless $self, $class; 
    $self->clear(); 
    $self->addValue($_) foreach @args; 
    return $self; 
} 

我的東西構造函數的所有參數到@args數組,然後遍歷他們和我們的統計對象中添加這些值。

另外,不要忘了實際撥打results()來執行您的測試。它將打印:

Number of values: 5 
Total: 149 
Mean: 29.8 
+0

非常感謝你們所有人 – user1708526