概念の証明とともに数年後にC++に戻ってきました。私はクラスを定義するhppファイル、クラスメソッドを持つcppファイル、テストのためのmain.cppを持っています。私は自分のスレッドで実行されるtcpサーバを作成しようとしています(一度だけ呼び出されます)。私は同じcppファイル内のすべてのコードで作業を開始しましたが、クラスとメソッドを独自のファイルに入れたのでコンパイルエラーが発生します。C++ 11他のクラスまたはソースファイルのクラスメソッドを参照する方法
私は検索しましたが、動作するものは見つかりませんでした。私はextern、 'シングルトン'メソッドなどを使用してみましたが、そのすべてがさまざまなエラーメッセージを引き起こします。私は、メソッドに対する正しい参照を提供していないことを知っています。
tcpserver.hpp
:
#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
:
#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
、
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
関連していませんが、C++ 11以降の 'std :: thread'を使うことができます。 'pthread'はちょうどうんざりです! :) – Arunmu