Я вернулся на C++ по прошествии нескольких лет с доказательством концепции. У меня есть файл hpp, который определяет класс, файл cpp с методами класса и main.cpp для тестирования. Я пытаюсь создать tcp-сервер, который работает в своем потоке (только один раз). Я начал со всего кода в том же файле cpp и заставил его работать, но теперь я получаю ошибки компиляции, когда я поместил класс и методы в свои собственные файлы.C++ 11 Как ссылаться на методы класса в других классах или исходных файлах
Я искал, но не нашел ничего, что работает. Я пытался использовать extern, метод «singleton» и т. Д., Которые все приводят к различным сообщениям об ошибках. Я знаю, что я не даю правильной ссылки на методы.
tcpserver.hpp
:
#ifndef __TCP_SERVER_HPP_INCLUDED__
#define __TCP_SERVER_HPP_INCLUDED__
#include <string>
class Server {
public:
static void *tcp_server(void * dummy);
static void hello();
static int parseCmd(const char *cmd, char *reply);
static int copystring(char *reply, const char *msg);
private:
};
#endif
tcpserver.cpp
, с методами класса как заглушек:
#include <iostream>
#include <cstdlib>
#include <pthread.h>
#include <unistd.h>
#include <cstring> // Needed for memset
#include <sys/socket.h> // Needed for the socket functions
#include <netdb.h> // Needed for the socket functions
#include <string.h>
#include "tcpserver.hpp"
int Server::parseCmd(const char *cmd, char *reply) {
//does stuff
}
int Server::copystring(char *dst, const char *src) {
// does stuff
return (int) ((std::string) dst).length();
}
void Server::hello() {
std::cout << "Server says 'hello'." << std::endl;
}
void *Server::tcp_server(void * dummy) {
const char *port = "5555";
// does a lot of stuff
}
main.cpp
:
#include <iostream>
#include <pthread.h>
#include "tcpserver.hpp"
int main() {
Server server;
server.hello(); // 'Canary' method FIRST ERROR
// Initialize and set thread joinable
pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
pthread_t serverthread;
int rc;
// **** tcp_server method must be static ****
rc = pthread_create(&serverthread, NULL, server.tcp_server, NULL);
if (rc){
std::cout << "Error:unable to create thread," << rc << std::endl;
exit(-1);
}
std::cout << "Main() started thread." << std::endl;
pthread_attr_destroy(&attr);
void *status;
rc = pthread_join(serverthread, &status);
if (rc){
std::cout << "Error:unable to join," << rc << std::endl;
exit(-1);
}
return 0 ;
}
makefile
:
all : main.o tcpserver.o
g++ -std=c++11 -o tcpserver main.o tcpserver.o
tcpserver.o: tcpserver.cpp tcpserver.hpp
g++ -std=c++11 tcpserver.hpp
main.o : main.cpp tcpserver.hpp
g++ -std=c++11 main.cpp -lpthread
clean:
rm -f tcpserver.o main.o tcpserver
Какие сообщения об ошибках вы получаете? Кроме того, '__TCP_SERVER_HPP_INCLUDED__' является зарезервированным именем - не используйте двойные символы подчеркивания. – Barry
Это немного странно (разрешено, но странно), чтобы вызвать статические функции через экземпляр класса. Вы действительно хотите, чтобы эти функции были статичными? – GManNickG
Не связано, но вы можете использовать 'std :: thread' от C++ 11 и далее. 'pthread' теперь просто выглядит yuck! :) – Arunmu