2009-08-05 10 views
0

S'il vous plaît aidez-moi à séparer les classes, en-têtes et main() dans le programme suivant. J'ai fait de mon mieux mais il y a un problème.Comment puis-je séparer les en-têtes, les classes et les fonctions principales en C++?

#include "stdafx.h" 
#include<iostream> 
#include<string> 
using namespace std; 

class player 
{ 
public: 
    string name; 
    string type; 
    void getdata() 
    { 
     cout<<"Enter the name of the Player : "<<endl; 
     cin>>name; 
     cout<<"Enter the Game he play : "<<endl; 
     cin>>type; 
    } 
    void display() 
    { 
     cout<<"The name of the Player is : "<<name<<endl; 
     cout<<"The game he will play is : "<<type<<endl; 
    } 
}; 

int main() 
{ 
    player sachin; 
    sachin.getdata(); 
    sachin.display(); 
    system("pause"); 
    return(0); 
} 
+0

Pouvez-vous fournir plus de détails sur le problème. – ChrisF

+0

@ ChrisF, Sir j'ai besoin de diviser le programme en classes et principal séparément. La déclaration de méthode doit également être séparée et la définition doit être séparée dans un fichier cpp. Aidez-moi – Rajasekar

+0

Non, j'essaie juste d'apprendre – Rajasekar

Répondre

1

Si vous souhaitez séparer vos classes, vous devez créer deux fichiers; .h & .cpp.

Dans le fichier d'en-tête, vous placez vos définitions et vos déclarations, et dans le fichier CPP, vous implémentez vos méthodes.

Player.h

#ifndef __PLAYER_H_ 
#define __PLAYER_H_ 

#include <string> 

class Player 
{ 
public: 
    Player(); 
    ~Player(); 

    // Methods 
    void GetData(); 
    void Display(); 

private: 
    std::string Name; 
    std::string Type; 
} 

#endif 

Player.cpp

#include "Player.h" 

Player::Player(): Name(""), 
        Type("") 
{ 
} 

Player::~Player(){} 

void Player::GetData() 
{ 
    std::cout << "Enter the name of the Player : " << std::endl; 
    std::cin >> name; 
    std::cout << "Enter the Game he play : " << std::endl; 
    std::cin >> type; 
} 

void Player::Display() 
{ 
    std::cout <<"The name of the Player is : " << name << std::endl; 
    std::cout <<"The game he will play is : " << type << std::endl; 
} 

Edit:

variables membres de classe ne devraient jamais être public; Ecrivez une méthode set si vous avez besoin de modifier une variable membre.

+0

Je ne suis pas un adepte de la stricte école de pensée privée Si vous devez fournir un accès plus ou moins direct à une variable membre, cela ne sert à rien et vous complique la tâche pour la cacher , puis écrivez set_ et get_ routines pour le rendre public à nouveau –

4

Voulez-vous dire comment vous séparez cela en fichiers header et cpp?

Si oui dans Player.h vous souhaitez effectuer les opérations suivantes:

#ifndef __PLAYER_H_ 
#define __PLAYER_H_ 

#include<string> 
using namespace std; 

class player 
{ 
protected: // could be private 
    string name; 
    string type; 
public: 
    void getdata(); 
    void display(); 
}; 

#endif 

dans player.cpp:

#include "stdafx.h" 
#include "Player.h" 
#include<iostream> 

void player::getdata() 
{ 
    cout<<"Enter the name of the Player : "<<endl; 
    cin>>name; 
    cout<<"Enter the Game he play : "<<endl; 
    cin>>type; 
} 

void player::display() 
{ 
    cout<<"The name of the Player is : "<<name<<endl; 
    cout<<"The game he will play is : "<<type<<endl; 
} 

Et puis dans main.cpp vous souhaitez effectuer les opérations suivantes:

#include "stdafx.h" 
#include "player.h" 

int main() 
{ 
    player sachin; 
    sachin.getdata(); 
    sachin.display(); 
    system("pause"); 
    return(0); 
} 

Ce serait le moyen idéal de diviser tout en fichiers d'en-tête et cpp séparés :)

+0

@Goz, comment allez-vous initialiser les membres protégés? –

+3

Et placer 'using namespace std' dans un en-tête est une mauvaise pratique. –

+0

Avec un constructeur est la méthode habituelle. http://www.fredosaurus.com/notes-cpp/oop-condestructors/constructors.html – Goz

4

Une séparation typique dans des fichiers en C++ serait la suivante:

// myapp.cpp 
// --------- 

#include "player.h" 
#include <cstdlib> 
using std::system; 

int main() 
{ 
    player sachin; 
    sachin.getdata(); 
    sachin.display(); 
    system("pause"); 
    return(0); 
} 

// player.h 
// -------- 

// or #pragma once, since you're on MS. 
#ifndef player_h 
#define player_h 

#include<string> 

class player 
{ 
public: 
    std::string name; 
    std::string type; 
    void getdata(); 
    void display(); 
}; 
#endif 

// player.cpp 
// ---------- 

#include "player.h" 
#include<iostream> 
#include<string> 
using namespace std; 

void player::display() 
{ 
    cout<<"The name of the Player is : "<<name<<endl; 
    cout<<"The game he will play is : "<<type<<endl; 
} 
void player::getdata() 
{ 
    cout<<"Enter the name of the Player : "<<endl; 
    cin>>name; 
    cout<<"Enter the Game he play : "<<endl; 
    cin>>type; 
} 

Il y a quelques autres choses qui pourraient être tondu: vous pouvez mettre stdafx.h en arrière, et les chaînes dans le lecteur n'ont pas besoin d'être public. Notez également que je n'ai pas mis "using namespace std" dans le fichier d'en-tête. Beaucoup de gens préfèrent ne pas le faire, du moins pas à l'échelle mondiale, mais si votre en-tête le fait, cela leur est imposé s'ils utilisent votre classe. Peu importe d'une façon ou d'une autre quand les fichiers sont faits pour vous, mais cela importe beaucoup dans un grand projet si les en-têtes "utilisent" des choses de manière inattendue. Cela peut causer des problèmes à quelqu'un qui ne se rend pas compte que toutes les fonctions de std sont visibles et en appelle une par hasard en essayant d'appeler autre chose.

J'ai délibérément utilisé les trois options dans les trois fichiers: using namespace std;, using std::system;, ou en spécifiant l'espace de noms à chaque fois.

Questions connexes