Προσπαθώντας να επιβαρύνει cout << χειριστή, αλλά όχι εργασίας του

ψήφοι
1

Θα snipped τα άσχετα μέρη έξω από την τάξη μου εδώ. Δεν ξέρω τι κάνω λάθος, απλώς προσπαθεί να είναι σε θέση να cout << το αντικείμενο.

#include <iostream>

class Snipped
{

    public:
        friend std::ostream& operator<<(std::ostream& os, const Snipped& s);

    protected:
    private:
};

std::ostream& operator<<(std::ostream& os, const Snipped& s)
{
    os << test;
    return os;
}

int main(int argc, char* argv[])
{
    Snipped* s = new Snipped();

        std::cout << s << std::endl << s;

    delete s;
    return 0;
}

Αναμενόμενη έξοδος:

test
test

Πραγματική εξόδου:

0x12ae20
0x12ae20  (random memory location?)
Δημοσιεύθηκε 31/01/2012 στις 04:26
χρήστη
Σε άλλες γλώσσες...                            


3 απαντήσεις

ψήφοι
8
std::cout << s << std::endl << s;      

Σας καλούν <<με μια διεύθυνση, θα πρέπει να το αποκαλούν με το αντικείμενο του τύπου Snipped.
Η γραμμή του παραπάνω κώδικα δεν θα καλέσει υπερφορτωθεί λειτουργία διαχειριστή σας, διότι οι παράμετροι της υπερφορτωμένο λειτουργία δεν ταιριάζουν.

Θα πρέπει να καλέσετε:

std::cout << *s << std::endl << *s;      

Αυτό εξασφαλίζει το <<υπερφορτωμένο λειτουργία χειριστής καλείται επειδή οι παράμετροι που ταιριάζει σε αυτό.

Απαντήθηκε 31/01/2012 στις 04:30
πηγή χρήστη

ψήφοι
6

Προσπαθήστε

std::cout << *s << std::endl; 

Παρεμπιπτόντως,

std::cout << s << std::endl; 

Δεν είναι πραγματικά μια τυχαία θέση μνήμης.

Είναι η πραγματική διεύθυνση μνήμης στο σωρό, σε αυτή την περίπτωση.

Μπορείτε να χρησιμοποιήσετε πραγματικά αυτήν τη διεύθυνση για να ελέγξει την ταυτότητα ενός αντικειμένου.

Αυτό είναι χρήσιμο κατά τον εντοπισμό σφαλμάτων, ή σε πραγματικό κώδικα. Για παράδειγμα, αν δει κανείς φορέων ανάθεσης, θα δείτε συχνά:

class Foo
{
  Foo& operator=( const Foo& foo )
  {
    // use the identity principle 
    if ( &foo==this )
      return *this;  // so I don't waste CPU cycles copying to myself

    // ...really do copy here
    return *this;
  }
};
Απαντήθηκε 31/01/2012 στις 04:30
πηγή χρήστη

ψήφοι
2

Παρά το γεγονός ότι μόλις εύρεση τιμών του δείκτη (δηλαδή να χρησιμοποιούν «* s» αντί για «s») υπάρχει μεγαλύτερα ψάρια για να τηγανίσετε! Εκτός αν υπάρχει ένας καλός λόγος για την τοποθέτηση ενός αντικειμένου στο σωρό δεν πρέπει να το κάνετε αυτό:

int main()
{
    Snipped s;
    std::cout << s << '\n' << s;
}

Βρήκα τη χρήση του newκαι έτσι deleteπολύ σπάνιο στα προγράμματα που γράφω. Εκτός από το πιο απλό κώδικα αυτό αποδίδει εύκολα και συχνά πιο γρήγορα τα προγράμματα. Αν πρέπει πραγματικά να διαθέσει κάτι στο σωρό, χρησιμοποιήστε κάποιο είδος του έξυπνου δείκτη για να βεβαιωθείτε ότι το αντικείμενο απελευθερώνεται αυτόματα:

int main()
{
    std::unique_ptr<Snipped> s(new Snipped);
    std::cout << *s << '\n' << *s;
}

Σαν δευτερεύουσα σημείωση, δεν χρησιμοποιούν std::endlούτε εκτός αν πραγματικά την πρόθεση να ξεπλύνετε το ρεύμα: Βρήκα ακατάλληλη χρήση του std::endlνα είναι η αιτία των μαζικών προβλήματα απόδοσης πάνω από μία φορά. Σίγουρα τις περισσότερες φορές δεν έχει σημασία, αλλά σε ακόμη πιο περιπτώσεις που δεν ενδιαφέρονται για το ίδιο επίπεδο. Αν δεν σας αρέσει χρησιμοποιείτε '\n'ή "\n"μπορείτε αντ 'αυτού να χρησιμοποιήσετε ένα προσαρμοσμένο χειριστή:

std::ostream& nl(std::ostream& out) { return out << '\n'; }

Με αυτό μπορείτε να χρησιμοποιήσετε nlαντί του std::endlκαι δεν πάσχουν από πάντα έξαψη το ρεύμα.

Απαντήθηκε 31/01/2012 στις 04:46
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more