元投稿者は電子制御プログラムを作成していましたが、最近 C++ を勉強しており、C と C++ の開発手法には共通点と相違点があることに気づきましたので、ここにまとめておきます。
C 言語の開発では、変数や関数の宣言は .h ファイルに置かれますが、著者が C++ を書いていたときに、クラスの宣言も .h ファイルに入れたいと思ったのですが、それが使用できないことがわかりました。 、そのため、彼はそれらをすべて記述する必要がありました (. h ファイルにはクラス内のすべてのコンテンツが含まれています) が、この場合、. h は不要に感じられ、cpp ファイルを直接インクルードするだけです。最終的に、筆者が個人的に満足のいく、複数ファイルのクラスを利用できる方法を見つけたので、ここで共有したいと思います。
投稿者が行っている、socketapi を単純なクラスにカプセル化する小さな演習を例として考えてみましょう。
これは主にクライアントプログラムを示すだけの表現形式です。
MySocket.h
#pragma once
class MySocket {
private:
sockaddr_in addr_in;
int clientfd;
public:
MySocket(const char* addr, int post);
bool Socket();
bool Connect();
int Send(const char * str);
int Receive(char* str);
};
.h クラスでプロパティと関数を宣言し、.cpp で関数を実装します。
MySocket.cpp
#include <iostream>
#include<winsock2.h>
#include "MySocket.h"
#define DOMAIN AF_INET
#pragma comment(lib, "ws2_32.lib")
using namespace std;
MySocket::MySocket(const char *addr,int post) {
WSADATA wsd; //定义WSADATA对象
WSAStartup(MAKEWORD(2, 2), &wsd);
memset(&addr_in, 0, sizeof(addr_in));
addr_in.sin_family = DOMAIN;
addr_in.sin_port = htons(post);
addr_in.sin_addr.S_un.S_addr = inet_addr(addr);
}
bool MySocket::Socket() {
return (this->clientfd = socket(DOMAIN, SOCK_STREAM, 0)) == -1;
}
bool MySocket::Connect() {
return connect(this->clientfd, (const sockaddr*)&this->addr_in, sizeof(this->addr_in));
}
int MySocket::Send(const char* str) {
return send(this->clientfd, str, strlen(str), 0);
}
int MySocket::Receive(char* str) {
return recv(clientfd, str, sizeof(str), 0);
}
この方法により、関数とプロパティが分離されるため、非常に直感的に見え、非常に使いやすくなります。