Schrift
[thread]10230[/thread]

Referenz zu Klassen speichern



<< >> 9 Einträge, 1 Seite
Tr0Nix
 2007-08-27 18:03
#98716 #98716
User since
2006-11-21
44 Artikel
BenutzerIn
[default_avatar]
Hallo zusammen

Folgendes Problem:
Ich möchte in einem Konfigurations-Objekt Referenzen auf Klassen verwalten, um diese dann an anderen Teilen in meinem Code wieder zuzugreifen.

Beispiel:
Code (perl): (dl )
1
2
$config->setConfig('CUI', new Curses::UI (-clear_on_exit => 1, -debug => $debug));
$config->getConfig('CUI')->set_binding(sub{exit}, "\cQ");


Das Funktioniert ganz prima.

Ich will es jetzt aber einen Schritt weitertreiben und das $config-Objekt, welches alle Referenzen gespeichert hat, an eine Klasse von mir weitergeben

Code (perl): (dl )
my $ui     = new UI(\$config);


In der Klasse selbst wird im Konstruktor über das Konfigurationsobjekt auf eine Registrierte Klasse (hier Curses::UI) zugegriffen:
Code (perl): (dl )
1
2
3
4
5
6
7
sub new {
        my ($self, $config) = @_;
        bless $config, UI_Config;
        my $main = $config->getConfig('CUI')->add(
                undef, 'Window',
                -title => 'Main Window',
        );


Leider klappt das jedoch nicht ganz wie ich es mir wünsche. Die Fehlermeldung die ich erhalte ist:
Can't call method "add" on an undefined value at Forms/UI.pm line 8.

Ich vermute, er weiss nicht, was für ein Objekttyp $config->getConfig('CUI') zurückliefert. Weiss einer wie ich das machen kann?

Grüsse
Joel
#Kein Kommentar
 2007-08-27 18:42
#98718 #98718
User since
2007-06-09
575 Artikel
HausmeisterIn
[default_avatar]
ich kenne mich zwar mit OO in Perl nicht so sehr aus, aber muss es nicht so heißen?

Code (perl): (dl )
my $ui     = new UI($config); #nicht als referenz übergeben


könnte es das sein?
Gerade weil wir alle in einem Boot sitzen, sollten wir froh sein, dass nicht alle auf unserer Seite sind
sid burn
 2007-08-27 19:07
#98719 #98719
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Ja es ist so wie "Kein Kommentar" sagte. Um eine Referenz zu kopieren musst du diese nicht nochmals referenzzieren. Sonst erhälst du eine Referenz auf ein Referenz.

Code (perl): (dl )
1
2
3
my $var  = "Hallo";  # Original
my $ref1 = \$var;    # $ref1 ist nun eine Referenz auf $var
my $ref2 = $ref1;    # $ref2 ist nun eine Referenz auf $var


Hier sind jetzt $ref1 und $ref2 jeweils Referenzen auf $var. $ref1 ist ja schon eine referenz und von dieser Referenz wird eine Kopie in $ref2 abgelegt.
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
Tr0Nix
 2007-08-27 20:11
#98724 #98724
User since
2006-11-21
44 Artikel
BenutzerIn
[default_avatar]
Prima danke, ich probiers morgen mal aus. Ich habe es zuerst ohne \$ probiert (also mit $config), aber da hatte ich das blessing (bless $config, UI_Config;) noch nicht.

Gebe auf alle Fälle morgen noch Bescheid :).
sid burn
 2007-08-27 20:26
#98725 #98725
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Das mit dem "bless" sehe ich ja jetzt erst, einen Konstruktur sollte man so schreiben:

Code (perl): (dl )
1
2
3
4
5
6
sub new {
    my ($class, %args) = @_;

    my $hash_href = { %args };
    return bless $hash_href, $class;
}


Dein Konstruktur erlaubt keine Vererbung!

Das ganze kann man natürlich auch verkürzen. ;)
Code (perl): (dl )
sub new { bless { @_[1..$#_] }, $_[0] }
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
Tr0Nix
 2007-08-27 22:38
#98730 #98730
User since
2006-11-21
44 Artikel
BenutzerIn
[default_avatar]
Achtung.. das war nicht der ganze Konstruktor den ich gezeigt habe. Das blessing mache ich nur, damit ich mit der $config Referenz arbeiten kann. Ansonsten hat Perl nicht kapiert, dass es sich um ein Objekt handelt sondern meint es ist ein normaler skalar. Deshalb blesse ich implizit nach UI_Config.

Das blessing für UI kommt am Ende des Konstruktors, habe ich aber draussen gelassen um der Übersichtlichkeits willen.
Struppi
 2007-08-28 11:18
#98745 #98745
User since
2006-02-17
628 Artikel
BenutzerIn
[Homepage]
user image
Wenn $config ein Objekt ist "kapiert Perl" das natürlich, dein bless $config ist hier fehl am Platze, so wie es aussieht ist der Rückgabewert von getConfig() kein Objekt.
Tr0Nix
 2007-08-28 11:30
#98746 #98746
User since
2006-11-21
44 Artikel
BenutzerIn
[default_avatar]
Hallo Zusammen

@struppi: Hattest Recht (wenigstens zu 50%), das bless war unnötig. Ich wusste nicht, dass Perl so schlau ist und den Type einer Referenz erkennt.. aber bin auch (noch?) kein Monk mit meiner <1 Jahr Perl Erfahrung :).

Habe unterdessen rausgefunden, was faul war. Mir fehlten offenbar die Klassendefinitionen in der UI.pm Klasse. Also einfach mal stupide die "use ..." Statements von der main-Funktion kopiert und jetzt klappts! Vermutlich erkannte er den Typ des Objektes nicht, welcher $config zurücklieferte und konnte somit auch keine Methoden davon zugreifen (.. und die Referenz nicht als Objekt erkennen).

Gruess & danke für die Hilfe
Joel
pq
 2007-08-31 12:59
#98916 #98916
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
nur der vollständigkeit halber: es gibt keine referenzen auf klassen.
man kann objekte einer klasse instantiieren und von diesen referenzen bilden,
aber eine klasse ist kein objekt.
schon perlboot und perlbot gelesen?
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
<< >> 9 Einträge, 1 Seite



View all threads created 2007-08-27 18:03.