C++ Software-Design Study - 2
·
C++
이전에는 각객체마다 Draw함수가 있어 각 객체가 Draw를 하는 방식이었다. 이것을 조금 바꿔볼건데 2단계를 거쳐서 바꿀것이다. 첫번째 방법은 일반적인 Visitor패턴을 사용하는 방법이고두번째 방법도 Visitor 패턴을 사용하는데 C++의 variant를 사용해서 수정해 볼 것이다. Visitor 이 패턴은 기존 객체의 구조를 변경하지 않고도 새로운 연산을 추가할 수 있게 해주는 패턴이다. 객체 구조와 알고리즘을 분리객체가 방문자를 수용(accept())하면 방문자가 객체를 처리(visit())새로운 작업 추가 시 기존 코드 수정 없이 새로운 Visitor 클래스 구현만으로 확장 가능 코드로 알아보자[Shape 코드]class Shape{public: explicit Shape() = defaul..
C++ Software-Design Study - 1
·
C++
보통의 객체지향 프로그램을 작성한다고 했을 때 "다형성"의 특징을 이용한다. 다형성은 쉽게 말해 하나의 타입으로 여러형태의 객체를 다를 수 있는 특징이다. 코드로 살펴보면 앞으로 그림을 그리는 프로그램을 만든다고 해보자 그림을 그리는 프로그램은 필요한 객체들을 모두 그린다는 요구사항이있다. 현재 필요한 객체는 '사각형' '원'이다. 이러한 요구사항을 가지고 있을 때 객체지향의 다형성을 가지고 어떻게 프로그램을 구현할 수 있을까? 구현방법1. Shape 인터페이스를 만든다. 인터페이스에서는 Draw 함수가 정의되어있다.2. 원, 사각형은 Shape의 함수를 구현한다.3. main 함수에서 각 객체를 그려준다. 코드Shape Classstruct Point{ double x; double y;};cla..
윈도우 소켓 깔끔하게 작성해보기
·
C++/네트워크
#pragma comment(lib,"ws2_32.lib")#include #include #include class WSAInitializer {public: WSAInitializer() { int result = WSAStartup(MAKEWORD(2, 2), &wsaData_); if (result != 0) { throw std::runtime_error("WSAStartup failed"); } } ~WSAInitializer() { WSACleanup(); } WSADATA& GetWSAData() { return wsaData_; }private: WSADATA wsaDa..
Modern C++ Thread 간결하게 사용하기
·
C++/기초
#include #include #include #include #include #include using namespace std::chrono_literals;void ThreadFunction(int threadNumber, std::latch& latch) { for (int i{ 0 }; i threads; for (int i{ 0 }; i  std::jthread를 사용합니다. 이는 C++20에서 도입된 새로운 스레드 클래스로, 자동으로 join을 수행하며 취소 요청을 지원합니다.std::latch를 사용하여 모든 스레드의 완료를 동기화합니다. 이는 C++20에서 도입된 새로운 동기화 프리미티브입니다.std::format을 사용하여 문자열 포매팅을 수행합니다. 이는 C++20의 새..
c++20 간결하게 코드쓰기(1)
·
C++/기초
struct OddAndEvens { std::vector odds, evens; };OddAndEvens separateOddsAndEvens(const std::vector& arr) { std::vector odds, evens; for (int i : arr) { i % 2 == 1 ? odds.emplace_back(i) : evens.emplace_back(i); } return OddAndEvens{ .odds = odds,.evens = evens };}int main(){ std::vector vecUnSplit{ 1,2,3,4,5,6,7,8,9,10 }; auto oddAndEvens{ separateOddsAndEvens(vecUnSplit) }; auto [odds, eve..
다시써보는 에코서버2 window 버전
·
C++/네트워크
이전버전에서 쓰레드를 추가했다. #include #include #include #include #include #include #pragma comment(lib, "ws2_32.lib")auto EchoHandler(SOCKET clientSocket)->void{ int receiveSize; std::array receivedBuffer; while ((receiveSize = ::recv(clientSocket, receivedBuffer.data(), receivedBuffer.size(), 0)) > 0) { ::send(clientSocket, receivedBuffer.data(), receiveSize, 0); std::cout.write(rec..
다시써보는 에코클라이언트 Linux 버전
·
C++/네트워크
#include #include #include #include #include #include #include #include // linux versionint main(){ int sock = 0; sockaddr_in server_addr = { .sin_family = AF_INET, .sin_port = htons(8888), }; std::array buffer{}; std::string message = "Hello, Server!"; // 소켓 생성 if ((sock = socket(AF_INET, SOCK_STREAM, 0)) (&nOpt), sizeof(nOpt)); // 서버 IP 주소 ..
다시 써보는 에코서버 window 버전
·
C++/네트워크
#include #include #include #include #pragma comment(lib, "ws2_32.lib")int main() { WSADATA wsaData; if (::WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { std::cerr (&serverAddress), sizeof(serverAddress)) == SOCKET_ERROR) { std::cerr (&clientAddress), &clientAddressSize)) != INVALID_SOCKET) { std::cout receivedBuffer; while ((receiveSize = ::recv(clientSocket, rec..