2015-11-25 2 views
-1

J'essaie d'écrire une application de console comme Twitter. Les classes User et UserList entre elles. J'essaie d'accéder aux abonnés de l'utilisateur suivant. La classe UserList est utilisée pour la liste chaînée.Accéder au membre privé de la classe d'un ami

//User.h 

#pragma once 

#include <iostream> 
#include <string> 

using namespace std; 

class UserList; 
class User 
{ 
    friend class UserList; 
private: 
    string userName; 
    string personalComment; 
    UserList *followed; 
    UserList *following; 
    int followedNumber; 
    int followingNumber; 
    //TWEET 
    UserList *blocked; 
    User* next; 
public: 
    User(); 
    User(string&,string&); 
}; 

//UserList.h 
#pragma once 

#include <iostream> 
#include <string> 

using namespace std; 


class User; 

class UserList{ 
private: 
    User *root; 
public: 
    UserList(); 
    ~UserList(); 
    void addUser(string&,string&); 
    bool checkUser(string&); 
    User& findUser(string&); 
    void printList(); 
}; 

D'abord, j'ai écrit une fonction pour trouver l'utilisateur suivant.

//userList.cpp 
User& UserList::findUser(string& name) 
{ 
    User *temp=root; 
    while(temp!=NULL) 
    { 
     if(!name.compare(temp->userName)) 
     { 
      return temp; 
     } 
     temp= temp->next; 
    } 
    temp= temp->next; 
    return temp; 
} 

Par exemple, utilisateur1 veut suivre utilisateur2. Je veux vérifier user1 ne suivent déjà utilisateur2. (Checkuser (nom d'utilisateur) recherche un utilisateur dans une liste, et bool)

//main.cpp in main() 
if(users.findUser(user1name).following->checkUser(user2name)) 
{ 
      cout<<"Err: The user '"<< user1name << "' has already followed '"<<user2name<<"'!"<<endl; 
} 

Mais il y a une erreur « UserList * L'utilisateur :: suivant est privé » et " dans ce contexte "

Comment puis-je accéder aux listes de cet utilisateur?

+1

Twitter est une application console? – user463035818

+0

@ tobi303 Pensé exactement la même chose. : P Apparemment il y a des gens qui n'utilisent pas un moteur de rendu HTML mais qui lisent juste les tags et tout ... – Downvoter

+0

Il n'y a pas de 'User :: follows' dans votre code – user463035818

Répondre

0

En général, vous ne devriez pas mettre la logique de vos classes dans le main. Votre problème peut être résolu par exemple en ajoutant une méthode à User qui essaie d'ajouter un autre utilisateur au lieu de le faire dans le main. Quelque chose comme ceci:

User::FollowOther(std::string other){ 
    if(this->following->checkUser(other)) { 
     cout<<"Err: The user '"<< userName << "' has already followed '"<<other<<"'!"<<endl; 
    } 
    /*...*/ 
} 

L'erreur que vous avez parce que User::following est privé dans User. Les membres privés ne sont accessibles qu'à partir de la classe. L'exception est la suivante: Vous pouvez accéder aux membres privés à partir d'une classe différente déclarée comme ami. Mais vous ne pouvez pas accéder aux membres privés dans le main. D'ailleurs, je ne suis pas du tout fan des déclarations d'amis, parce que cela brise l'encapsulation et rend la relation entre les classes moins évidente, mais c'est juste mon opinion personnelle.

+0

oh je comprends! J'essaye maintenant –

+0

@MervePia il y a quelques autres petits problèmes avec votre code, par exemple. Pourquoi stockez-vous des pointeurs sur les listes? Je ne vois pas le besoin de le faire. Et une autre chose mineure: avoir 'followsNumber' et' followingNumber' en tant que membres de 'User' vous oblige à écrire du code inutile parce que vous devrez garder ces numéros à jour. Au lieu de cela, fournissez une méthode 'size()' pour UserList qui servira le même but. – user463035818