C ++、Java、Python、PHPなど、すべてのオブジェクト指向言語(またはOOPをサポートする言語)にclone
は、オブジェクトの深いコピーまたは浅いコピーを返すことができる独自の関数があります。clone
ディープコピーとシャローコピーの両方で、独自の関数を最初から作成する方法を教えてもらえますか?明らかに、私はそれ自体serialize
は言うまでもなく、のような言語構造を使用することはできませんclone
!の例はPHP
素晴らしいでしょうが、他の言語でも問題ありませんが、その方法を知る必要があります。それだけです。
2 に答える
パート1
/* memcpy example */
#include <stdio.h>
#include <string.h>
struct {
char name[40];
int age;
} person, person_copy;
int main ()
{
char myname[] = "Pierre de Fermat";
/* using memcpy to copy string: */
memcpy ( person.name, myname, strlen(myname)+1 );
person.age = 46;
/* using memcpy to copy structure: */
memcpy ( &person_copy, &person, sizeof(person) );
printf ("person_copy: %s, %d \n", person_copy.name, person_copy.age );
return 0;
}
http://www.cplusplus.com/reference/clibrary/cstring/memcpy/から取得
パート2
複雑なオブジェクトのすべての子要素をコピーする必要があると想定しています(図1の架空のオブジェクトAをコピーする場合のように、黒い色のオブジェクトをコピーするだけで他のオブジェクトを参照として保持する必要がある場合は、上記でリンクしたコードを使用できます、以下の擬似コードは、すべての子アイテムもコピーする場合に使用します)上の図は、オブジェクトの現実と考え方を示しています。
function MyCloneRecursive(object A) : object
{
pointer Cpy;
allocate memory to Cpy;
memcpy(&Cpy,&A,sizeof(A))
//now copy all its child elements
//assuming there is a way to do a foreach that
//for object A there are A.B,A.C and inside A.B there is D
//and childname={"B","C"} and inside of B childname={"D"}
for each childname in object A
{
eval("Cpy." + childname + "=MyCloneRecursive(A." + childname + ")");
}
}
//note this is really bad programming
//clone function is better written in the runtime
//(or its a part of the intepreter not a includable code)
ここでPHPについて説明します。
// Bad class
class Obj{
private $_Property = 'value';
public function __construct(){
if(!func_num_args()){
throw new \InvalidArgumentException('Needs arguments.');
}
}
}
// Instantiate
$obj = new Obj(1);
// Clone
$obj1 = clone $obj;
// Deep clone
$obj2 = unserialize(serialize($obj));
// Dump all (see it worked)
var_dump($obj);
var_dump($obj1);
var_dump($obj2);
// Now try to clone yourself
$objclass = get_class($obj);
// But you don't know the arguments for every class.
// And drama unfolds here, exceptions get thrown!
$obj3 = new $objclass();
PHPクローン$obj; およびunserialize(serialize($ obj)); __construct()を回避します-または。このようにして、オーブンに入れずに焼きたてのオブジェクトを取得します。自分のクローンを作成するには、オーブンに入れる(新しくする)必要があります。しかし、すべてのオブジェクトと__constructの引数がわからない場合、または壊れてしまう可能性があります。
コア言語の輪を作り直さないでください。あなたはほとんどできません!
PS:クローンできないオブジェクトもあります。SimpleXMLElementが今頭に浮かびます。これをsimplexml_load_string($ sxe-> asXML())で再解析するか、DOMノードにインポートしてSXEに戻す必要があります。