Hoe creëer je een instantie van een klasse in C ++

Ik ben een C ++ -beginner. Ik heb een klasse en als ik probeer te compileren, zegt het dat het 'main' mist.

Wat moet ik doen om een ​​exemplaar van deze klasse te maken en toegang te krijgen tot de methoden?

#include 
#include 

using namespace std;

class Account
{
      string name;
      double balance;

  public:
      Account(string n);
      Account(string n, double initial_balance);

      string get_name() const;
      double get_balance() const;

      void deposit(double amount);

      void widthdraw(double amount);

};

bewerken

Waar plaats ik de hoofdmethode?

Ik heb geprobeerd het in een ander bestand te plaatsen zoals het volgende

    #include 
    int main(){
    Account:: Account(string n) : name(n), balance(0){}
    return 0 ;
    }

maar dit geeft een foutmelding dat er geen account in de directory staat. Ik vermoed dat dit komt omdat het niet is gecompileerd

bewerken

Beide bestanden bevinden zich in dezelfde map

account_main.cc

    #include
    #include 
    #include "Account.cc"

    Account:: Account(string n) : name(n), balance(0){} 
    int main()
    {
        Account account("Account Name");//A variable called "account"
        account.deposit(100.00);//Calls the deposit() function on account

        return 0 ;
    }

Account.cc

#include
#include 

using namespace std;

class Account
{
      string name;
      double balance;

  public:
      Account(string n);
      Account(string n, double initial_balance);

      string get_name() const;
      double get_balance() const;

      void deposit(double amount);

      void widthdraw(double amount);

};
0
Definieer je de klasseconstructor in de definitie van main? Werkelijk, zelfs als het huiswerk is, zorg voor een goed C ++ -boek en werk aan de basisbeginselen.
toegevoegd de auteur Christian Rau, de bron
Als dit huiswerk is, heb je dan geen boek waarvan je aan het lezen bent? Ik ben er vrij zeker van dat het iets fundamenteels moet omvatten.
toegevoegd de auteur ildjarn, de bron
toegevoegd de auteur wkl, de bron
Waar leer je van? Ik denk dat je een of meer van de hier vermelde boeken nodig hebt: stackoverflow.com/q/388242/10077
toegevoegd de auteur Fred Larson, de bron

3 antwoord

Voor alle C ++ -programma's is een zogenaamd -invoerpunt vereist. De functie main() is altijd het beginpunt voor standaard C ++ -programma's. U moet een main() functie opgeven, anders zal de linker klagen. U kunt een main() -functie op twee manieren schrijven:

int main()
{
    return 0;
}

Of, als u opdrachtregelargumenten verwacht:

int main(int argc, char ** argv)
{
    return 0;
}

Merk op dat void main() niet geldig is in C ++ . Merk ook op dat een return -instructie niet strikt noodzakelijk is voor main() -functies, maar je moet er toch expliciet een schrijven, omwille van de consistentie.

C ++ -standaard 3.6.1 Hoofdfunctie [basic.start.main]

     

5. Een return-statement in main heeft het effect van het verlaten van de hoofdfunctie (het vernietigen van objecten met automatische opslagduur) en   exit met als resultaat de return-waarde. Als de controle bereikt   het einde van de main zonder een return-statement tegen te komen, het effect is   die van het uitvoeren van

  retourneert 0;
 

Om je vraag over je laatste bewerking te beantwoorden:

#include 

int main(){ 
    Account:: Account(string n) : name(n), balance(0){} 
    return 0 ; 
} 

De vorm van main() is correct, maar dit is niet hoe u klassenliddefinities opgeeft. De constructor moet buiten de hoofdfunctie staan.

#include 

// Outside of main()
Account::Account(string n) : name(n), balance(0)
{
} 

int main()
{ 
     return 0 ; 
} 

Als u een instantie van Account wilt maken, declareert u een variabele en geeft u alle benodigde constructorargumenten op de volgende manier door:

int main()
{
    Account account("Account Name");//A variable called "account"
    account.deposit(100.00);//Calls the deposit() function on account
                            //Make sure you provide a function
                            //definition for Account::deposit().
    return 0;
}

Also, check the exact file path of where class Account is. If the Account class is in a file called Account.h and is in the same folder as the file containing the main() function, then you need to use #include "Account.h" instead of #include in that file. For example:

#include "Account.h"//Note .h and quotes

Account::Account(string n) : name(n), balance(0)
{
} 

int main()
{
   //...
    return 0;
}

Dit is eigenlijk een vrij fundamenteel aspect van de C ++ programmeertaal. Je hebt toch een boek dat dit behandelt? In feite zijn main() -functies en # include -instructies meestal het eerste dat u leert bij het programmeren in C ++. Ik raad ten zeerste aan dat je een goed C ++ -boek ophaalt en doorleest hen en doe de oefeningen.

6
toegevoegd
dank daarvoor. Ik heb toegevoegd aan de originele post alsjeblieft een kijkje nemen.
toegevoegd de auteur code511788465541441, de bron
Ik heb de hoofdmethode in main_account.cc en bevindt zich in dezelfde map als account.cc. wanneer ik main_account.cc probeer te compileren, staat er geen account in de directory. Ik heb # include en # include geprobeerd, maar het werkt niet. er is ook geen uitvoerbaar bestand van Account in die map en ik kan het niet maken, want wanneer ik probeer Account te compileren, staat er geen hoofdmethode
toegevoegd de auteur code511788465541441, de bron
Ik heb de inhoud van beide bestanden toegevoegd aan het oorspronkelijke bericht. Kijk alsjeblieft even en plaats een vaste versie als je kunt. bedankt
toegevoegd de auteur code511788465541441, de bron
ok ik deed dat en het is wanneer ik compileer main_account.cc het zegt "main_account.cc:(.text+0x92): undefined verwijzing naar` Account :: storting (dubbel) '"
toegevoegd de auteur code511788465541441, de bron
kreeg het werken heel erg bedankt dank je
toegevoegd de auteur code511788465541441, de bron
@ user521180: Hernoem Account.cc naar Account.h en voer een # include "Account.h" uit in Account_main.cc .
toegevoegd de auteur In silico, de bron
@ user521180: in welk bestand bevindt class Account zich? Wordt dit Account.h genoemd? Omdat u ook de bestandsextensie in insluitingsinstructies moet opgeven. Wanneer u een bestand compileert, geeft u ook het bestandspad door aan het bronbestand, niet het headerbestand, d.w.z. main_account.cc , niet Account .
toegevoegd de auteur In silico, de bron
@Tyler Ferraro: Ja. Zie mijn laatste bewerking.
toegevoegd de auteur In silico, de bron
Is dat geldig? Het geeft niets terug ...
toegevoegd de auteur Genzume, de bron

For your latest edit: not Account in the directory

probeer dit:

#include "Account.h"  //quotes, and .h


Account:: Account(string n)  //this must be outside of main, it's its own function
: name(n), balance(0) //I put these on three seperate lines but
{}                    //that's a personal choice

int main(){  //this is what the code should do when it starts
    Account person1("George"); //create a Account called person1 with the name George
    cout << person1.get_name(); //c-output person1's name.
    return 0 ; //return success (success=0)
}
1
toegevoegd
# include "Account.cc" werkte. de klasse met de hoofdmethode compileert maar Account.cc nog niet heeft gecompileerd, is dat normaal?
toegevoegd de auteur code511788465541441, de bron
Zoek iemand (persoonlijk) om je te leren gebruiken wat je compiler ook is. Er zijn veel stappen en concepten die je mist.
toegevoegd de auteur Mooing Duck, de bron
Wanneer u een # include -bestand kopieert, plakt u dat bestand in de huidige, zodat de spullen in dat bestand inderdaad worden gecompileerd. Waarom zeg je dat het niet compileert?
toegevoegd de auteur Mooing Duck, de bron
# include plakt in principe de inhoud van het genoemde bestand op de locatie van de include-instructie. Dus met # include "Account.cc" wordt de inhoud van Account.cc gecompileerd als onderdeel van main_account.cc. Over het algemeen wordt het als een slechte gewoonte beschouwd om .cc-bestanden als deze op te nemen. In plaats daarvan zou u een '.h' header-bestand moeten gebruiken en uitzoeken hoe u kunt vertellen wat er in een koptekst staat vergeleken met wat er in een .cc-bestand staat. In uw geval hoeft u alleen # include en te verwijderen met naamruimte std; , de juiste instanties van std :: toe te voegen, en hernoem dan Account.cc naar Account.h.
toegevoegd de auteur bames53, de bron

zoals is opgemerkt, heb je een degelijk boek nodig. Om uw vragen te beantwoorden, zou u het volgende moeten weten: Klassen worden meestal gedefinieerd in .h-bestanden en geïmplementeerd in .cpp- of .cc-bestanden. U zou drie bestanden moeten hebben: Account.h, Account.cc en main.cc. Je compileert alleen de .cc-bestanden en de .h-bestanden zijn opgenomen in de delen van de code waar je iets over de klasse moet weten (dat wil zeggen wanneer je daadwerkelijk iets met de klas doet). Als je g ++ gebruikt (linux, unix of mingw denk ik) kun je het programma compileren met de volgende opdracht: g ++ main.cc Account.cc -o program_name

main.cc:

#include 
using namespace std;

#include "Account.h"
int main() {
  Account a("first account");

  cout << a.get_balance() << endl;
  a.deposit(100.0);
  cout << a.get_balance() << endl;

  return 0;
}

Uw account.h-bestand zou er als volgt uit moeten zien:

#include
//#include  -- not needed here

// using namespace std; -- don't use 'using' in header files

class Account
{
  std::string name;
  double balance;

public:
    Account(std::string n);
    Account(std::string n, double initial_balance);

    std::string get_name() const;
    double get_balance() const;

    void deposit(double amount);

    void widthdraw(double amount);

};

En tot slot zou uw Account.cc-bestand de klasse moeten implementeren.

#include "Account.h"

using namespace std;

Account::Account(string n) : name(n), balance(0.0) {}

Account::Account(string n, double initial_balance) :
name(n), balance(initial_balance) {}

string Account::get_name() const {
  return name;
}

double Account::get_balance() const {
  return balance;
}

void Account::deposit(double amount) {
  balance += amount;
}

void Account::widthdraw(double amount) {
  balance -= amount;//generously allow overdraft...
}

Ik hoop dat het helpt.

Romeins

1
toegevoegd