Προς το περιεχόμενο

Header files και constructor c++


Επισκέπτης

Προτεινόμενες αναρτήσεις

Παρακάτω θα δείτε 2 κώδικες και για κάποιον λόγο δεν τρέχουν και δεν μου εμφανίζει το dev τον λόγο που δεν τρέχουν όποιος μπορεί help

Header files:

 

#include <iostream>

using namespace std;

class Student
{
private:
    int hli;
    int xrspou;
    int vath;
 
public:
    Student(int hli, int xrspou, int vath)
    {
        student(hli, xrspou, vath);
    }
 
    void student(int hli, int xrspou, int vath)
    {
        hli=24;
        xrspou=7;
        vath=25;
    }
 
    int gethli() { return hli; }
    int getxrspou() { return xrspou; }
    int getvath()  { return vath; }
};

 

constructor:

#include <iostream>

using namespace std;

class Student {        
  public:          
    
  int hli,xrspou,vath;
    Student::Student( int h, int x, int v )
     { 
      hli=h;
      xrspou=x;
      vath=v;
    }
};

int main() 
{
  
 
  student.hli=24;
  student.xrspou=7;
  student.vath=25;


   cout << student.hli << " " << student.xrspou << " " << student.vath << "\n";
 
  return 0;
}

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)

Αρχικά δεν ισχύει ότι δεν σου βγάζει error το περιβάλλον που χρησιμοποιείς. Ίσως να μην καταλαβαίνεις απλά τι σου λέει.

Ας τα πάρουμε από την αρχή:

void foo(int bar);

Αυτό ονομάζεται declaration δηλαδή απλά δηλώνεις ότι υπάρχει μια συνάρτηση με το τάδε όνομα(εδώ foo) που παίρνει τα τάδε ορίσματα(εδώ bar) και γυρνάει το τάδε (εδώ void).

Αυτά μπαίνουν στα header files.

 

void foo(int bar){
    // do something
}

Αυτό λέγεται definition δηλαδή ορίζω τι κάνει μια συνάρτηση.

Αυτά μπαίνουν στα source files.

Προφανώς δεν απαντάω στο ερώτημα σου αλλά καταλαβαίνω ότι δεν έχεις αυτές τις γνώσεις που είναι αναγκαίες.


Με αυτά μπορείς να βρεις κάποια λάθη στον δικό σου κώδικα;

Επεξ/σία από kaliakman
  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

1 λεπτό πριν, kaliakman είπε

Στα header files βάζεις μόνο declarations και όχι definitions. Στα source files/.cpp βάζεις τα definitions.

δεν κατάλαβα

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

23 λεπτά πριν, kaliakman είπε

Αρχικά δεν ισχύει ότι δεν σου βγάζει error το περιβάλλον που χρησιμοποιείς. Ίσως να μην καταλαβαίνεις απλά τι σου λέει.

Ας τα πάρουμε από την αρχή:


void foo(int bar);

Αυτό ονομάζεται declaration δηλαδή απλά δηλώνεις ότι υπάρχει μια συνάρτηση με το τάδε όνομα(εδώ foo) που παίρνει τα τάδε ορίσματα(εδώ bar) και γυρνάει το τάδε (εδώ void).

Αυτά μπαίνουν στα header files.

 


void foo(int bar){
    // do something
}

Αυτό λέγεται definition δηλαδή ορίζω τι κάνει μια συνάρτηση.

Αυτά μπαίνουν στα source files.

Προφανώς δεν απαντάω στο ερώτημα σου αλλά καταλαβαίνω ότι δεν έχεις αυτές τις γνώσεις που είναι αναγκαίες.


Με αυτά μπορείς να βρεις κάποια λάθη στον δικό σου κώδικα;

Φταίω που δεν τα μαθαίνω έτσι...εγώ λέω απλός δηλώνω την συνάρτηση με void και το άλλο απλός ότι την δημιουργώ..δεν τα λέω  declaration και definition είναι κακό το ξέρω

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

4 λεπτά πριν, vense97 είπε

Φταίω που δεν τα μαθαίνω έτσι...εγώ λέω απλός δηλώνω την συνάρτηση με void και το άλλο απλός ότι την δημιουργώ..δεν τα λέω  declaration και definition είναι κακό το ξέρω

Τα ονόματα δεν έχουν σημασία σε αυτό το σημείο. Ξαναλέω δεν έχεις καταλάβει τι σημαίνουν όπως και αν τα λες. Μπορείς να λες Μήτσο και Κώστα. Μπορείς να βρεις σημεία στο δικό σου κώδικα που δεν κάνει αυτό που περιγράφω στο αρχικό μήνυμα; (Διαχωρισμός των δυο αυτών εννοιών στα διαφορετικά αρχεία)

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

8 λεπτά πριν, kaliakman είπε

Τα ονόματα δεν έχουν σημασία σε αυτό το σημείο. Ξαναλέω δεν έχεις καταλάβει τι σημαίνουν όπως και αν τα λες. Μπορείς να λες Μήτσο και Κώστα. Μπορείς να βρεις σημεία στο δικό σου κώδικα που δεν κάνει αυτό που περιγράφω στο αρχικό μήνυμα; (Διαχωρισμός των δυο αυτών εννοιών στα διαφορετικά αρχεία)

μου απαντησε και ο καθηγητης και με μπερδεψε περισσοτερο.....

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

1 λεπτό πριν, vense97 είπε

μου απαντησε και ο καθηγητης και με μπερδεψε περισσοτερο.....

Έχεις γράψει 3 μηνύματα χωρίς περιεχόμενο. Αν θέλεις βοήθεια προσπάθησε λίγο.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

2 λεπτά πριν, kaliakman είπε

Έχεις γράψει 3 μηνύματα χωρίς περιεχόμενο. Αν θέλεις βοήθεια προσπάθησε λίγο.

εαν θες μπορω να σου στείλω την εκφώνηση 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Καραντίνα έχουμε...Φτιάχνεις καφεδάρα το πρωί, βάζεις youtube βιντεάρα, ίσως και ο new boston να έχει σειρά για c++, αράζεις στην καρεκλάρα και μαθαίνεις...

Ειλικρινά, πιο εύκολος τρόπος να μάθεις τα βασικά, αμφιβάλλω αν υπάρχει.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • 2 εβδομάδες αργότερα...

Για μένα ένας από τους καλύτερους youtubers σε C++ είναι o TheCherno. C++ playlist. Θα βρεις ένα βίντεο όπου εξηγεί τι κάνουν τα header files

Ουσιαστικά αυτό που φαίνεται ότι κάνεις είναι ότι χρησιμοποιείς τα header files λάθος. Όταν δημιουργείς συναρτήσεις, τις δημιουργείς γιατί θες να τις καλέσεις σε διάφορα μέρη του κώδικα σου. Για να μπορεί όμως ο compiler να γνωρίζει ότι δημιούργησες μια συνάρτηση και την έχεις κάπου μέσα στον κώδικα σου θα πρέπει να την δηλώσεις (δλδ declaration) πάνω ψηλά. Καμιά φορά οι σύγχρονοι compilers βρίσκουν τις συναρτήσεις που έγραψες αλλά αυτό δεν συμβαίνει πάντα (ούτε πρέπει για να λέμε την αλήθεια). Όπως αναφέρθηκε και πιο πάνω ένα declaration δεν περιέχει υλοποίηση. Εξού και στα header files, συνήθως δεν βάζεις κάτι άλλο πέραν από declarations.

Αν δεις στο δικό σου το header file επιστρέφεις τιμές, αναθέτεις τιμές σε μεταβλητές κτλπ. Σαν να μην φτάνει αυτό έχεις την ίδια συνάρτηση σε άλλο αρχείο. Εδώ ο compiler θα παραπονεθεί διότι έχεις δύο συναρτήσεις με το ίδιο όνομα στο ίδιο πρόγραμμα, δημιουργία κλάσης με το ίδιο όνομα.... Ως επίσης, στον "constructor", δεν  κάνεις import to header file και κάποιες τιμές όπως hli για παράδειγμα λείπουν από την κλάση που όρισες στον constructor. Άποψη μου, σε 4-5 προτάσεις δεν θα καταλάβεις και πολλά για ένα θέμα που χρειάζεται ολόκληρο κεφάλαιο για να εξηγηθεί. Δες αυτό πρώτα.

Στη συνέχεια δες για κλάσεις από το ίδιο playlist. Κι άμα κάτι δεν κατάλαβες το ξανασυζητάμε.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Κανονικά στο header file βάζεις μόνο το declaration των κλάσεων και μεθοδών και συναρτήσεων klp. Δηλαδή το δικό σου είναι αυτό

student.h

#pragma once

class Student
{
  private:
      int hli;
      int xrspou;
      int vath;
  
  public:
      Student(int, int, int);
      int gethli();
      int getxrspou();
      int getvath();
};

Στο .cpp με το ίδιο όνομα βάζεις το implementation δηλαδή το student.cpp είναι κάπως έτσι

#include "student.h"
Student::Student(int a, int b, int c)
{
    hli = a;
    xrspou = b;
    vath = c;
}
int Student::gethli() { return hli; }
int Student::getxrspou() { return xrspou; }
int Student::getvath()  { return vath; }

και στη main.cpp εισάγεις το header είναι δηλαδή κάπως έτσι

#include <iostream>
#include "student.h"

using namespace std;

int main() 
{
    Student stud {24,7,25};
    cout << stud.gethli() << " " << stud.getxrspou() << " " << stud.getvath() << "\n";
    return 0;
} 

Το pragma once να το χρησιμοποιείς πάντα γιατί όπως βλέπεις το .h γίνεται include σε 2 αρχεία και μπορεί να γίνει σε περισσότερα.

τις ιδιότητες τις δήλωνεις private οπότε μπορείς να τις πάρεις μόνο μέσω των μεθόδων και όχι με stud.hli που θες να το κάνεις.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δεν ξέρω πόσο βοηθητικό είναι να δίνεις έτοιμη την λύση ενώ φαίνεται οτι εδώ υπάρχει σοβαρό πρόβλημα. Απλά θα κολλήσει πάλι στο επόμενο πρόβλημα.

Υ.Γ. Το 

#pragma once

καλό είναι να αποφεύγεται καθώς δεν είναι του standard.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

 

6 ώρες πριν, kaliakman είπε

Δεν ξέρω πόσο βοηθητικό είναι να δίνεις έτοιμη την λύση ενώ φαίνεται οτι εδώ υπάρχει σοβαρό πρόβλημα. Απλά θα κολλήσει πάλι στο επόμενο πρόβλημα.

Έχεις δίκιο, δεν μου  φάνηκε για normal άσκηση άλλα για μια προσπάθεια να καταλάβει πως δουλεύει. Είπα να δώσω μια ώθηση μήπως και βοήθησω.

Για το #pragma once έχεις δίκιο αλλά εάν έγγραφα αυτό το if not defined define endif θα ήταν too much.

Επίσης @vense97 υπάρχουν εκτός από βίντεο πολύ ωραία tutorials που εξηγούν πως γίνονται τα πράγματα.

 

  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...