Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


Finn fem fel i koden

Postades av 2007-05-09 20:57:53 - Jonas Ekström, i forum c++, Tråden har 9 Kommentarer och lästs av 1308 personer

Läste Computer Sweden idag där det fanns en anst.annons där de som kunde hitta fem fel i koden nedan kunde söka tjänsten. Om någon hittar svaren så ska jag publicera företaget som söker en C++ utvecklare ;)

<code>
template <typename T>
T& Clone(T a_src)
{
T ret = 0;
T* tmp = NULL;
tmp = new T(a_src);
ret = *tmp;
return ret;
}
</code>

(jag lovar att jag inte ska stjäla svaren och söka jobbet :))


Svara

Sv: Finn fem fel i koden

Postades av 2007-05-09 21:41:27 - Niklas Jansson

De tre första är riktiga fel, 4, 5 och 6 mer "är det verkligen vettigt?":

1. ret är en template, och inget garanterar att operator= är definierad för en int.
2. tmp deleta:s inte.
3. Man kan (ska) inte returnera en referens till en lokal variabel.

4. Varför NULL istället för tilldelning direkt, och varför tilldelning till tmp istället för tilldelning till ret direkt?
5. Om det nu finns en operator(T), varför inte använda den direkt i kod? Varför ha en Clone-funktion öht?
6. a_src bör väl skickas som en const &T?


Svara

Sv:Finn fem fel i koden

Postades av 2007-05-10 00:11:12 - Andreas Hillqvist

Kan man inte bara tilldela tal 0?

T ret = 0;

Jag tror om koden avser klasser är denna raden ogiltlig.

Är det "korrekt" svaret något sådant här?
template <typename T>
T* Clone(const T& a_src)
{
    return new T(a_src);
}


Svara

Sv: Finn fem fel i koden

Postades av 2007-05-10 09:32:50 - Martin Adrian

>Man kan bara tilldela tal 0:

Nix, alla typer som har en konstruktor som accepterar 0 fungerar fint.
Alla följande typer fungerar

struct C {
  C(int);
};

struct D {
  D(char*);
};

struct E {
  E& operator=(int);
};


>Är det "korrekta" svaret något sådant här?

Nej, det finns nog inget korrekt svar. Clone är funktion som man använder om det finns anledning att skilja på copy och clone. Ett exempel skulle kunna vara att du har en klass som innehåller en pekare till ett annat objekt. copy innebär då att att det nya objektet har samma pekare medan clone innebär att man får en ny pekare.

struct C {
  C(int a) : m(a) { };
  int m;
};

struct D {
  D(int a) : mp(new C(a)) { }
  D D(const D& a) { D tmp; tmp.mp = a.mp; return tmp; } // copy constructor
  D Clone() { return D(mp->m); }
protected:
  D() : mp(NULL) { }
private:
  C* mp;
};

main() {
  D a(3);
  D b = a; // a och b delar nu samma object C
  D c = a.Clone(); // a och c innehåller samma värde fast med olika object C
}


(Vet att koden ovan skapar minnesläckor men det är bara ett exempel)

En annan konstighet är att Clone är en "fri" funktion (dvs ej medlem). Som jag beskrev ovan är ju anledningen till att man har en Clone att man behöver fixa något internt i klassen och det kan ju inte en "fri" funktion göra om den inte är friend. Men i det här fallet är det ju en template och har för mig att man inte kan ha friend templates.

template <typename T>
T Clone(const T& a) { return T(); }



Svara

Sv:Finn fem fel i koden

Postades av 2007-05-10 19:58:01 - Jonas Ekström

Vi kan väl sammanfatta felen så här då:

1. T& Clone(T a_src) // borde vara T& Clone(const &T a_src)
2. T ret = 0; // fel eftersom man inte kan förutsätta att typen har en ctr som hanterar tilldelningen
3. tmp = new T(a_src); // en Clone som använder implicit shallow copying?
4. ret = *tmp; // återigen en implicit operation
5. tmp's minne frigörs inte
6. return ret; // returnerar lokala instanser

Jag lovade ju länken till företaget som sökte C++ utvecklare, så här är den:

http://csjobb.idg.se/Arbetsgivaren.nsf/All/B4F8D2674AEC0687C12572D400287B68?OpenDocument&id=2


Svara

Sv: Finn fem fel i koden

Postades av 2007-05-11 08:00:56 - Martin Adrian

>1. T& Clone(T a_src) // borde vara T& Clone(const &T a_src)

T Clone(const T& a_src);



Svara

Sv:Finn fem fel i koden

Postades av 2007-05-11 09:00:19 - Jonas Ekström

;)


Svara

Sv:Finn fem fel i koden

Postades av 2007-05-11 10:29:08 - Andreas Hillqvist

Kommer den då inte att kopiera värdet när man tilldelar den?
Är det inte bättre att retunera en pekare?


Svara

Sv: Finn fem fel i koden

Postades av 2007-05-11 11:01:31 - Martin Adrian

>Kommer den då inte att kopiera värdet när man tilldelar den?

I teorin ja men det finns inte något alternativ eftersom du kanske inte vill tilldela den till en variabel.

Clone(x).SomeMethod();

I praktiken lär kompilatorn dessutom använda Return-value-Optimization (RVO) vilket innebär att kod som:

T func() {
  T x;
  x = ...
  return x;
}

a = func();

görs om till
void func(T& x) {
  x = ...
}

T a;
func(a);


>Är det inte bättre att retunera en pekare?

Nix, vi pratar c++ och där använder man (nästan) aldrig pekare.


Svara

Sv:Finn fem fel i koden

Postades av 2007-05-11 12:39:43 - Andreas Hillqvist

Tack för informationen.


Svara

Nyligen

  • 19:38 Rekommendera något intressant
  • 19:13 Международная перевозка грузов
  • 00:01 DL Van Tuning | Exclusive Body Kit
  • 12:08 Indian casino
  • 04:14 Vad finns det för kratomalternativ
  • 14:16 Indian online casino
  • 14:15 Indian online casino
  • 08:28 Butiksskyltar: Hur upplever utbude

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 570 872
27 965
271 770
425
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies