C++ operator voor pointer to object veranderen

Pagina: 1
Acties:

  • ilrenato
  • Registratie: December 2000
  • Laatst online: 01-04 11:19

ilrenato

Pizzah!!!!

Topicstarter
Ik heb een class/struct Time::Time en een paar operators gedefinieerd.
Alles werkt perfect.
Als ik nu ergens de tijd nodig heb, bijvoorbeeld een int dan zou ik kunnen
zeggen Tijd=Time.GetTime();

Is er nou een mogelijkheid dat ik de class/struct uitbreid zodat ik ook kan
zeggen Tijd=Time;

Dit kan nu niet, want Time is natuurlijk een pointer naar een Time object
Ik moet dus een soort typecast of operator definieren zodat ik als ik een int wil hebben als return value voor een variabele ???

Ik heb Time::Time() (operator () ) geprobeerd maar die syntax krijg ik niet goed, of het kan uberhaupt niet omdat het de constructor call is..

Verwijderd

Om te beginnen : Time is geen pointer, anders zou het Time->GetTime() zijn ipv Time.GetTime().

Een cast-operator definieren doe je als volgt :


In je header file met je class declaratie (in de public section natuurlijk)
C++:
1
  operator int ( ) const;


In je .cpp file met je implementatie
C++:
1
2
3
4
Time::operator int ( ) const
{
  return <int-waarde van Time object>; //Zet hier je object om naar type int
}


edit:
Grammaticafoutje weggewerkt en layout code P&W-Standards-Proof gemaakt

  • whoami
  • Registratie: December 2000
  • Nu online
[nohtml]
ilrenato schreef op 26 september 2002 @ 12:36:

Is er nou een mogelijkheid dat ik de class/struct uitbreid zodat ik ook kan
zeggen Tijd=Time;
Kijk eens naar operator overloading.

https://fgheysels.github.io/


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

ilrenato schreef op 26 september 2002 @ 12:36:
Is er nou een mogelijkheid dat ik de class/struct uitbreid zodat ik ook kan
zeggen Tijd=Time;

Dit kan nu niet, want Time is natuurlijk een pointer naar een Time object
Ik moet dus een soort typecast of operator definieren zodat ik als ik een int wil hebben als return value voor een variabele ???
Je bedoelt iets van de strekking:
C++:
1
2
3
4
5
6
7
class Time
{
...
public:
  operator = (const Time &p_Time)    { Assign(p_Time); }
...
}

En idd, lees eens wat over operator overloading.

Professionele website nodig?


Verwijderd

curry :
als ik een int wil hebben
Hij wil dus casten naar int, en geen copyconstructor zoals jij hebt gebouwd...

  • ilrenato
  • Registratie: December 2000
  • Laatst online: 01-04 11:19

ilrenato

Pizzah!!!!

Topicstarter
Akhorahil had zo'n beetje wat ik bedoelde, operator overloading heb ik wel doorgelezen en al gebruikt, maar de return value van een object veranderen was ff nieuw voor me.

Werkt het ook in een struct?
Ik had nu dus Time ActionTime;
return (int) ActionTime.GetTime();

en het moet worden
return (int) ActionTime();

't werkt nog niet nee...

Verwijderd

het moet worden
C++:
1
return int ( ActionTime );

als ik me niet vergis. Waarom zet jij die ronde haakjes er nou weer achter? Dat doe je toch ook niet als je van char * naar int cast? Nu roep je een functie aan, en je wilt gewoon het object casten naar int m.b.v. de nieuw gedifinieerde operator.
En ja, dat werkt ook met structs, want struct = class :)

Verwijderd

maar de return value van een object veranderen
Objecten hebben geen return values. Operators en functions wel...

  • ilrenato
  • Registratie: December 2000
  • Laatst online: 01-04 11:19

ilrenato

Pizzah!!!!

Topicstarter
Ja weet ik veel, eerste keer dat ik dit tegenkom..
Het werkt nu, briljant gewoon.. Deze syntax kom ik echt niet vaak tegen...

Thanx man!!!!

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 21-08 17:14
ilrenato schreef op 26 september 2002 @ 14:57:
Ik had nu dus Time ActionTime;
return (int) ActionTime.GetTime();

en het moet worden
return (int) ActionTime();

't werkt nog niet nee...
Laat die (int) maar weg, en die () erachter ook. ActionTime is geen functie die
je wil aanroepen, en C++ zal die (int) conversie automatisch doen.

Overigens is het een slecht idee om een Time automatisch naar een int te converteren. Wil je Time()/Time() kunnen schrijven? operator/(int,int) is onzin voor een Time class, gok ik.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • ilrenato
  • Registratie: December 2000
  • Laatst online: 01-04 11:19

ilrenato

Pizzah!!!!

Topicstarter
Ik wilde gewoon dat de basis eenheid in seconden is in mijn systeem, dus als ik de waarde van het object wil, ik direct de tijd in seconden krijg.

ik heb nu dus Tijd=(ActionTime); Gaat goed nu.. lijkt me redelijk logisch toch? Of is dit not done??

Verwijderd

Dit is not done, omdat je dan de compiler de mogelijkheid geeft om impliciet van seconden naar "wat-voor-integer-dan-ook" te casten. Als je toch al een class Tijd definieert, waarom reken je dan niet verder met Tijd-objecten?

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
class Tijd {
friend std::ostream& operator << (std::ostream&, Tijd);
friend std::istream& operator >> (std::istream&, Tijd&);
public:
    Tijd() : _secs(my_gettime()) {}
    explicit Tijd(int secs) : _secs(secs) {}
    // explicit om impliciete casts te voorkomen

    Tijd& operator += (Tijd t)
        {
            _secs+= t._secs;
            return *this;
        }
    Tijd& operator -= (Tijd t)
        {
            _secs-= t._secs;
            return *this;
        }
    Tijd& operator *= (int fac)
        {
            _secs*= fac;
            return *this;
        }
    Tijd& operator /= (int fac)
        {
            _secs/= fac;
            return *this;
        }

    Tijd operator + (Tijd t) const  { return Tijd(_secs + t._secs) }
    Tijd operator - (Tijd t) const  { return Tijd(_secs - t._secs) }
    Tijd operator * (int fac) const { return Tijd(_secs * fac) }
    Tijd operator / (int fac) const { return Tijd(_secs / fac) }
    int operator / (Tijd t) const   { return _secs / t._secs; }

    Tijd operator - () const        { return Tijd(-_secs); }

    bool operator == (Tijd t) const { return _secs == t._secs; }
    bool operator < (Tijd t) const  { return _secs < t._secs; }
private:
    int _secs;
};

inline Tijd operator * (int fac, Tijd t) { return t * fac; }

inline std::ostream& operator << (std::ostream& s, Tijd t)
    {
        return (s << t._secs);
    }
inline std::istream& operator >> (std::istream& s, Tijd& t)
    {
        return (s >> t._secs);
    }


Je kunt nu wel rekenen met je Tijd, maar je krijgt warnings als je rare dingen doet.
(PS: niet getest, uit de losse pols in de editbox getiept)

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 21-08 17:14

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • ilrenato
  • Registratie: December 2000
  • Laatst online: 01-04 11:19

ilrenato

Pizzah!!!!

Topicstarter
Wiel? Als in wiel opnieuw uitvinden?

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 21-08 17:14
ilrenato schreef op 27 september 2002 @ 09:49:
Wiel? Als in wiel opnieuw uitvinden?
Ja, je probeert redelijk hun werk te kopieren.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Verwijderd

Nah, ik typte in nog geen 5 minuten een voorbeeld, die lib zoeken had langer geduurd... :Y)
Pagina: 1