Contributed by RiotTown
on Mar 29, 2001 at 03:57 UTC
Q&A
> object-oriented programming
Description: I'm fairly new to this perl-OO stuff, but I am making headway except for a recent problem. I've got a package with the follow constructor and accessor methods, but I'm running into problems with creating a copy constructor.
sub new
{
my $self;
$self->{ A } = undef;
$self->{ B } = undef;
bless $self, 'Stuff';
}
sub A
{
my ( $self, $a ) = @_;
$self->{ A } = $a;
}
----
I've gotten the copy() method below to work:
sub copy
{
my ( $self ) = @_;
my ( $new );
%{ $new } = %{ $self };
bless $new, 'Stuff';
return $new;
}
The problem that I'm running into is that in the Stuff object I'd like $self->{ B } to be an array of another type of object (same type of structure, much different data). Whenever I call the copy constructor I just get a reference to the same array as the initial object, not a true copy. Any ideas as to what I'm doing wrong, or am I approaching this the wrong way?
Answer: How do I make a copy constructor? (inheritance?) contributed by japhy You want a deep copy -- try the Storable module; you want the dclone() function. | Answer: How do I make a copy constructor? (inheritance?) contributed by BazB
merlyn (otherwise known as Randal Schwartz) discusses shallow vs deep copying in one of his columns.
An alternative to Storable for creating clones/copies of objects is the Clone module.
| Answer: How do I make a copy constructor? (inheritance?) contributed by Anonymous Monk There is a potential other problem with your code, which I would like to pinpoint as
you have talked about inheritance.
If your copy method is called for a child of the Stuff class
it will generate a Stuff object and not the a Child-Of-Stuff object.
In order to avoid this you could bless to ref($self)
you might considder it unlikely that a child class will not override
the copy constructor, but reasonable applications
are thinkable. (e.g.dispatching by class, Stuff is abstract/interface and you just add methods in your child classes etc.)
And there is a not OO issue, what if you change the name of your class, you have to change all your bless statements...
It is in general a good idea not to hardcode this kind of information.
|
Please (register and) log in if you wish to add an answer
Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
Read Where should I post X? if you're not absolutely sure you're posting in the right place.
Please read these before you post! —
Posts may use any of the Perl Monks Approved HTML tags:
- a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
Outside of code tags, you may need to use entities for some characters:
| |
For: |
|
Use: |
| & | | & |
| < | | < |
| > | | > |
| [ | | [ |
| ] | | ] |
Link using PerlMonks shortcuts! What shortcuts can I use for linking?
See Writeup Formatting Tips and other pages linked from there for more info.
|
|