webForumDet fria alternativet

Clone()

5 svar · 343 visningar · startad av fnolis

fnolisMedlem sedan sep. 200162 inlägg
#1

Hummm....
hur kan man få detta att funka på ett vettigt sätt?

det är raden: " x* Clone() { new *this; }"
som jag behöver hjälp med... vet att det inte ska
gå att skiva så men jag vet inte hur jag ska illustrera det
på annat sätt...

det jag vill i slutändan är att X och Y i main ska vara av samma typ...

***************************

#include <string>
#include <iostream>

using namespace std;
class x;
class y;

class x
{
private:
string a;
public:
X(){ a="x"; }
x* Clone() { new *this; }
void set(const string a) { this->a = a; }
};

class y : public x
{
public:
y(){ set("y"); }
};

int main( int argc, char* argv[] )
{
x* X = new y;
x* Y = X->Clone();

delete X;
delete Y;

return 0;

}

[Redigerat av fnolis den 05 sep 2001]

UlfTMedlem sedan maj 20018 027 inlägg
#2

<font size="1" face="Verdana, Arial, Helvetica, sans-serif">Kod:<font size="1" face="Verdana, Arial, Helvetica, sans-serif" color="#666600">x* Clone(){ new *this; } går inte eftersom this är en pekare till ett objekt. New vill ha en klass, dvs mallen för ett objekt. Att döma av namnet på metoden kan jag tänka mig att du vill ha något i den här stilen:
<font size="1" face="Verdana, Arial, Helvetica, sans-serif">Kod:<font size="1" face="Verdana, Arial, Helvetica, sans-serif" color="#666600">x* Clone()
{
x* tmpObj = new x;
tmpObj->set(this->a);
return tmpObj;
}Nu bör också påpekas att du måste se över set-metoden i din klass. Så som du har skrivit den bryter du mot skyddet av den variabeln. "this->a"kommer nämligen peka mot exakt samma minnesutrymme som det "a" som du skickar in i set(). Det innebär att du efter set()-anropet kommer åt en privat egenskap utan att använda metoderna i klassen. Använd strncpy() istället. Då kopierar du innehållet i minnesblocken istället.

Angående slutändan, skriv en Clone()-metod för klassen "y" också. Då kommer X->Clone() i ditt exempel returnera ett y-objekt om metoden är skriven så.

fnolisMedlem sedan sep. 200162 inlägg
#3

Ska prova att fixa och trixa lite med detta. set() är bara med i exempelkoden "för att". Att skiva Clone() i y är det som jag har gjort i mitt riktiga program och vill komma bort från... ärver ner x till ca 100 klasser och då vill jag komma ifrån att skriva en Clone i varje...

UlfTMedlem sedan maj 20018 027 inlägg
#4

När man ärver klasser så ärvs metoderna också. Men det kan ju vara så att vissa metoder är väldigt specifika för vissa klasser, tex Clone-metoden eftersom den alltid ska returnera en kopia av sitt objekt. Då är det dessvärre svårt att undvika att skriva in metoden för varje klass i arvshierarkin.

fnolisMedlem sedan sep. 200162 inlägg
#5

"Då är det dessvärre svårt att undvika att skriva in metoden för varje klass i arvshierarkin"

Sant att det är svårt att undvika men det måste gå på något sätt. På det sätt dom du beskriver går det inte. Finns det ingen funktion som returnerar datatyp?

Och vad beträffar dit svar angående att this->a kommer att peka på samma a som inparametern, så stämmer inte detta... std::string är STL och operator= kopierar strängar.

UlfTMedlem sedan maj 20018 027 inlägg
#6

Och vad beträffar dit svar angående att this->a kommer att peka på samma a som inparametern, så stämmer inte detta... std::string är STL och operator= kopierar strängar.

Det har du rätt i. Jag är så van vid att tänka på char*-strängar.

127 ms totalt · 3 externa anrop · v20260731065814-full.0e50b1ef
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
125 ms — hämta tråd, inlägg och bilagor (db)