Wywołanie funkcji w funkcji

0

Mam klasę client w której stworzyłem metodę logowanie(); w której chcę uruchomić inne metody, próbuję tę metodę logowanie() wywołać ale coś robię nie tak, prosiłbym o wskazanie błędu.

 class Client
{
public:
	std::string name,login,password;
	sf::TcpSocket me;

	enum GameState {END,MENU,GAME};
	enum LoginState {pierwszy,drugi,rejestr};
	enum RegisterState {pier,dru,trz,czw,error};
	GameState state;
	LoginState state2;
	RegisterState state3;
	Client();
	~Client();
	sf::Socket::Status connect(const sf::IpAddress & IP, unsigned short port);
	sf::Socket::Status send(PacketType type, const std::string & msg);
	sf::Socket::Status receive(std::string & msg);
	sf::Socket::Status logging(PacketType type, const std::string & msg, const std::string & msg2);
	void wysylanie(Client client);
	void runClient();
	void menu(std::string login, std::string password);
	void rejestracja();
	void game();
	void logowanie(std::string login, std::string password);
	int czyemail(std::string a);
	int czyhaslo(std::string c, std::string b);
	
};
 
void logowanie(std::string login, std::string password,
	sf::Socket::Status connect(const sf::IpAddress & IP, unsigned short port),
	sf::Socket::Status send(PacketType type, const std::string & msg),
	sf::Socket::Status logging(PacketType type, const std::string & msg, const std::string & msg2))
{
	string IP = "127.0.0.1";
	unsigned short port = 54000;
	Socket::Status status = connect(IpAddress::LocalHost, port);
	if (status != sf::Socket::Done)
	{
	cout << "Sorry we couldn't connect\n";
	}
	send(INITIAL_NAME_DATA,"Seboxik");
	logging(LOGIN,login,password);
}
sf::Socket::Status Client::connect(const IpAddress & IP, unsigned short port)
{
	sf::Socket::Status stat = me.connect(IP, port);
	me.setBlocking(false);
	return stat;
}
sf::Socket::Status Client::send(PacketType type, const string & msg)
{
	sf::Packet packet;
	packet << type << msg;
	return me.send(packet);
}
sf::Socket::Status Client::logging(PacketType type, const std::string & msg, const std::string & msg2)
{
	sf::Packet packet;
	packet << type << msg << msg2;
	return me.send(packet);
}
 

A tak próbuję wywołać:

Client::logowanie(login, password,connect(const sf::IpAddress & IP, unsigned short port),
send(PacketType type, const std::string & msg),logging(PacketType type, const std::string & msg, const std::string & msg2)));
 
0

logowanie nie jest funkcja statyczna, musisz najpierw utworzyc obiekt i z tego obiektu wywolac logowanie

0

Czyli w takim razie, jeżeli ja potrzebuje wywołać funkcję w funkcji, to muszę w tej funkcji zrobić wskaźnik na obiekt klasy ?

0

nie rozumiem Cie.

Jezeli chcesz wywolac funkcje w funkcji to nie ma z tym zadnego problemu. Tylko musi zwracac odpowiedni typ np

void Display(int number)
{
  std::cout << number;
}
int Sum(int a, int b)
{
  return a+b;
} 

i wywolujesz to tka

Display(Sum(4,3));

u Ciebie jest taki problem, ze odwolujesz sie do funkcji ktora istnieje "tylko" i wylacznie z obiektem (bo nie jest statyczna)

mowie o tym

Client::logowanie 

nie mozesz odwolac sie do funkcji logowanie w ten sposob (poprzez operator ::)

musisz najpierw stworzyc obiekt Client i pozniej wywolac ta funkcje

auto client = make_unique<Client>(); // moglem sie walnac bo pisane z palca
client.ogowanie(login, password,connect(const sf::IpAddress & IP, unsigned short port),
send(PacketType type, const std::string & msg),logging(PacketType type, const std::string & msg, const std::string & msg2)));
0

W tej klasie mam metodę connect, send, logging i chcę aby się one uruchamiały w metodzie logowanie() i dalej mam "główną" metodę menu() w której chcę wywołać to logowanie(), to wszystko odbywa się w tej 1 klasie, i mam problem z wywołaniem logowanie() w tym menu(), trochę to zagmatwane :P

0
void logowanie(std::string login, std::string password);

A potem masz:

void logowanie(std::string login, std::string password,
    sf::Socket::Status connect(const sf::IpAddress & IP, unsigned short port),
    sf::Socket::Status send(PacketType type, const std::string & msg),
    sf::Socket::Status logging(PacketType type, const std::string & msg, const std::string & msg2))
{ 

Znajdź trzy różnice. ;) Szczególną uwagę zwróć na trzy ostatnie parametry - jakie mają typy?
Coś czego tam nie znajdziesz to brakujący Client:: przy definicji:

class C {
  void foo(int); //deklaracja metody
};
C::foo(int) { } //definicja

Poza tym:

Client c;
c.logowanie(login, pass);

Pomyśl dobrze co chciałeś osiągnąć przez to wywołanie funkcji w wywołaniu funkcji. Przecież metody connect, send i logging już wołasz w ciele metody logowanie:

    string IP = "127.0.0.1";
    unsigned short port = 54000;
    Socket::Status status = connect(IpAddress::LocalHost, port);
    if (status != sf::Socket::Done)
    {
    cout << "Sorry we couldn't connect\n";
    }
    send(INITIAL_NAME_DATA,"Seboxik");
    logging(LOGIN,login,password);

Czy to... na pewno Twój kod? ;)

0

Ehh tyle czasu kombinowałem co jest źle a tu taki głupi błąd, po prostu brakowało Client::logowanie... a jeżeli chodzi o te różnice, to już zacząłem wymyślać i modyfikować co się da :P Dziękuję wszystkim za pomoc.

1 użytkowników online, w tym zalogowanych: 0, gości: 1