shop.h

#include <string>
#include <vector>
#include <memory>
#include <fstream>

class Item
{
};

class Shop
{
public:
 Shop() {}
 Shop(std::string name, std::initializer_list<std::shared_ptr<Item>> items) {}
 Shop(std::string name, std::string fileName) {}
 void ReadDataFromFile() {}


 Shop(const Shop &) = default;
 Shop& operator=(const Shop&) = default;

 //Shop(Shop&& shop) = default;
 //Shop& operator=(Shop&& other) = default;
 ~Shop() {};

 void ShowItemList() {}

private:
 
 std::string m_name;
 std::vector<std::shared_ptr<Item>> m_items;
 std::string m_fileName;
 std::ifstream m_fileStream;

};

 

 

main.cpp

#include "shop.h"

int main()
{
 Shop weaponArmorShop = Shop("Weapon/Armor Shop", "equip_item.txt");
 
 //Shop temp1("Weapon/Armor Shop", "equip_item.txt");
 //Shop weaponArmorShop(temp1);
 //Shop weaponArmorShop2 = temp1;
 
 return 0;
}

 

위 코드를 실행하면 아래와 같은 에러가 나온다

 

 

왜 이런 에러가 나올까? 코드를 유심히 보고, default에 대한 정확하게 안다면 어렵지 않다.

나는 default에 대해서 자세히까지는 몰라서 잠깐이지만 당황했음 ^^;

 

 

 

 

by 흥배 2016.04.25 08:00

C++11에 새로 추가된 random 라이브러리의 난수 생성기((RNG. Random Number Generator) 오브젝트의 크기

 

RNG

gcc/64

gcc/32

Clang/64

MSVC/32

MSVC/64

minstd_rand0

8

4

8

4

4

minstd_rand

8

4

8

4

4

mt19937

5000

2500

5000

5000

5000

mt19937_64

2504

2504

2504

5008

5008

ranlux24_base

208

104

208

200

200

ranlux48_base

112

112

112

208

208

ranlux24

216

108

216

204

204

ranlux48

120

120

120

216

216

knuth_b

2064

1032

2064

1040

1040

 

 

 

출처: http://d.hatena.ne.jp/yohhoy/20131221/p1    https://gist.github.com/yohhoy/8032377 

 

 

by 흥배 2016.01.14 08:00

cppjosa https://github.com/myevan/cppjosa

위 버전은 mac에서만 빌드 및 테스드 되었다고 해서 나는 Windows 에서 사용하는데 문제 없는지 테스트 해보았다.

대부분 문제가 없었지만 작은(?) 문제로 Windows에서는 컴파일 및 실행에 문제가 있어서 아주 조금 수정하였다.

https://github.com/jacking75/cppjosa

Visual StudioC++11 지원 등의 문제로 최신 버전인 2015를 사용하였다.

 

수정된 부분

1. 소스 파일의 인코딩 변경

원 버전은 UTF-8(Bom 없음)이지만 VS에서는 인코딩 문제로 컴파일 실패

'유니코드 - 코드페이지 1200'으로 변경

 

2. std::locale("ko_KR.UTF-8") 문제

Windows에는 "ko_KR.UTF-8"을 지원하지 않음

프리프로세스를 이용하여 윈도우 플랫폼에서 빌드할 때는 std::locale("Korean")을 사용하도록 변경

이 문제는 아래의 링크 글을 참고하기 바란다.

http://includes.egloos.com/v/1504676 , http://sjc333.egloos.com/3137637

 

 

Visual Studio 실행

WinTest 디렉토리의 WinTest.sln을 실행하면 된다.

 


ps: C# 버전도 있다. https://github.com/myevan/csjosa




원 개발자분이 제가 보낸 PR을 적용해서 VS 2013 지원까지 됩니다. 그러니 

https://github.com/myevan/cppjosa 

이것을 사용하는 것이 좋습니다^^

by 흥배 2015.10.08 08:00
  • 크로스 2015.10.08 10:48 ADDR EDIT/DEL REPLY

    엌;; 꽤나 좋은 코드라고 생각합니다만;;;
    뭐랄까.. josa는 조금;;; ㅋ
    좋은 정보 감사합니다.

    • 흥배 2015.10.11 15:44 신고 EDIT/DEL

      주로 한국 프로그래머만 사용할 라이브러리라서 이름도 한국식인 것 같네요^^

  • 소래 2017.03.13 11:36 ADDR EDIT/DEL REPLY

    감사합니다 교수님 ~_~

    • 흥배 2017.03.21 11:48 신고 EDIT/DEL

      블로그 이사를 해서 댓글 이제 봐요^^
      조만간 점심이라도 같이해요~

오브젝트가 좌측 값 참조인지 혹은 우측 값 참조인지에 따라서 멤버 함수를 호출하는 것을 다르게 할 수 있다.

 

struct TEST

{

    void func() &

{

        cout << "lvalue" << endl;

    }

   

void func() &&

{

        cout << "rlvalue" << endl;

    }

};

 

 

int main()

{

    TEST t;

    t.func();

    TEST().func();

 

   return 0;

}

by 흥배 2014.08.04 08:00
  • 개굴개굴왕 2014.08.04 15:24 신고 ADDR EDIT/DEL REPLY

    안녕하세요. 블로그 내용이 좋아서♡ 블로그모음 서비스인 블로그앤미(http://blogand.me) 에 등록했습니다. 원하지 않으시면 삭제하겠습니다. 좋은 하루 되세요. ^^

  • rammerChoi 2014.08.04 18:03 ADDR EDIT/DEL REPLY

    이런것도 되는군요! 감사합니다 :)

  • 엠빠 2014.08.05 11:58 ADDR EDIT/DEL REPLY

    헐... 대박...

  • 엠빠 2014.08.05 17:59 ADDR EDIT/DEL REPLY

    헐... 흥배님은 천재?

  • 엠빠 2014.08.06 09:34 ADDR EDIT/DEL REPLY

    이거는... Visual Studio 2013에서는 아직 안되는군요 ^^

  • 엠빠 2014.08.14 14:31 ADDR EDIT/DEL REPLY

    헐 이거... VS2013 CTP에서는 되네요 ^^
    흥배님... 흥배님이 저술하신 C++11 STL도 마스터 했습니다.
    흥배님은 저의 영원한 우상...

shuffle() 알고리즘과 난수 엔진을 사용한다

 

vector<int> v { 1, 2, 3, 4, 5, 6, 7 };

shuffle( v.begin(), v.end(), mt19937(random_device()()) );

 


by 흥배 2014.07.29 08:00

[C++03 ]

int a[100];

for (int i=0; i<100; ++i)

a[i] = i;

 

vector<int> v(50);

for (size_t i=0; i<v.size(); ++i)

v[i] = i + 1000;

 

 

[C++11 ]

iota() 알고리즘을 사용한다.

 

int a[100];

iota(begin(a), end(a), 0);

 

vector<int> v(50);

iota(v.begin(), v.end(), 1000);

 

by 흥배 2014.07.25 08:00
  • gene6766 2014.07.28 08:22 ADDR EDIT/DEL REPLY

    안녕하세요~ 방명록에 글을 남길수 없어 여기 글을 남깁니다..ㅠ
    가입하고 방명록에 남길려고 하니 초대장을 받아야만 가입이 가능한지라..

    전 모바일 게임을 개발중인 인디팀입니다~ 클라 개발을 하고 있는데 서버도 개발하게 되어서 서버 관련 정보를 검색하다 보니
    c++로 서버를 구축할시 boost를 이용하면 많은 시간적 비용과 성능과 안정성을 들수 있어 용이하다고 해서 관련 책을 찾다 보니
    저자님께서 쓰신 책이 있더군요~

    그래서 어제 하나 구입을 했습니다~^^
    제가 여기 이렇게 글을 올린 이유는 ... 책 내용이 아닌.. 제가 상용화를 위한 서버 구현은 이번이 처음이라..

    스마트폰 게임의 미들코어 게임으로 서버를 구축할시 boost를 사용하는 것이 여러가지로 이득이 맞나요??
    그리고 서버는 클라우드를 사용할려 하는데 과거에는 분산 서버로 로그인 서버, 인게임 서버 이런식으로 트래픽 부하를 줄이기 위해
    서버를 분산했는데 클라우드를 사용시 저런 분리 없이 한 서버 안에서 용량을 늘리고 줄임으로 트래픽 적인 문제를 해결할수 있는건가요??

    대전 액션게임은 아니지만 그정도로 서로 바로바로 결과값을 알아야 할 정도로 패킷 전송이 빈번한 게임 스타일입니다~

    여러방면으로 저보다 훨씬 경험이 많으신거 같아 이렇게 질문 남겨 봅니다~~ 감사합니다!!

    • 흥배 2014.07.28 12:46 신고 EDIT/DEL

      안녕하세요

      실시간 통신 게임이라면 socket 을 사용하는 서버를 만들어야 합니다. boost를 사용하는 것이 처음부터 OS API를 사용해서 만드는 것보다는 훨씬 좋을 것입니다.

      서버 분산은 클라우드와 상관 없습니다. 어떻게 구현하느냐에 다릅니다. 보통 비동기 통신(http 통신) 방법으로 한다면 하나의 서버(애플리케이션을 말합니다)로 스케일아웃 할 수 있습니다.

      더 자세한 내용은 저보다는 '게임코디' 같은 개발자 커뮤니티에서 물어보세요

STL의 성능을 올리기 위해서 vector와 같은 컨테이너나 string 같은 것을 기본 메모리 할당자가 아닌 커스텀 메모리 할당자를 사용할 수 있다.

 

vector string 등을 개별적으로 사용하면서 커스텀 메모리 할당자를 사용하는 경우 커스텀 메모리 할당자 사용에 문제가 없지만, vector<string>과 같이 같이 사용하는 경우 만약 vector에만 커스텀 메모리 할당자를 지정하고 string에는 커스텀 메모리 할당자를 지정하지 않으면 예상과 다르게 한쪽만(vector) 커스텀 메모리 할당자를 사용하게 된다.

 

이런 문제를 해결하기 위해 C++11에서는 scoped_allocator가 생겼다. scoped_allocator_adaptorvector<string>의 메모리 할당자로 지정하면 vector string은 같은 메모리 할당자를 사용한다.

 


by 흥배 2014.07.16 08:00

SSE 등의 SIMD 명령이나 캐시를 의식한 프로그램은 메모리 얼라이먼트를 고려해야 한다.


메모리 얼라이먼트를 위해서 C++11 에서는 alignof와  alignas가 생겼다.

alignof: 변수나 타입의 얼라이먼트를 얻는다.

alignas: 변수 선언 때 얼라이먼트를 지정한다. 


int main() 

{

    alignas(int) unsigned char c[32]; // 배열 C는 int의 사이즈 단위의 어드레스로 배치.

    alignas(4) int a;          // a는 4 바이트 단위의 어드레스로 배치

    

alignas(32) int  array[8];  // array는 32바이트 단우의 어드레스로 배치 

int int_align = alignof(int); // int의 얼라이먼트를 얻는다.

}


alignas와 alignof 기능은 C++11 이전에는 각 컴파일러 마다 확장 기능을 가지고 있었음.

VC의 경우 alignas는  __declspec(align(byte)), alignof는 __alignof(type)

by 흥배 2014.07.14 08:00

Boost 라이브러리는 1.53 버전부터 코루틴이 정식으로 포함되었다. Boost 라이브러리 1.54 버전의 Asio에서는 코루틴을 Asio에서도 사용할 수 있게 되었다.

Asio에서 코루틴을 사용하기 위해서는 boost:asio::spawn을 사용한다.

 

Asio에서 비동기 I/O 함수를 사용할 때는 언제나 Asio의 비동기 함수를 호출하고, 이때 완료 함수를 등록 한다. 그리고 완료 함수가 호출에 의해 작업의 완료를 알게 된다.



boost::asio::spawn을 사용하면 코루틴에 의해 비동기 함수를 호출하면 호출한 곳으로 제어권을 넘긴 후 비동기 작업이 완료하면 비동기 함수 호출 이후 부분에 복귀하여 남은 작업을 처리한다.

아래는 boost::asio::spawn을 사용하여 비동기로 데이터를 보내는 코드이다.


 


< boost::asio::spawn을 사용하여 비동기로 데이터 보내기 >

 

코루틴을 사용해본 경험이 없다면 아마 위의 코드만으로는 잘 이해가 안될 것이다. 그러니 기존의 Chatting 서버를 boost::asio::spawn 사용 버전으로 만든 'ChattingTCPServer_spawn' 프로젝트를 꼭 보고 실행까지 해보기 바란다. boost::asio::spawn을 사용해서 코드가 이전에 비해서 줄어들어서 어렵지 않게 이해할 수 있을 것이다.


ChattingTCPServer_spawn.zip


 

 

<참조>

코루틴(coroutine) 관련 자료

http://devnote.tistory.com/223

 

Boost 라이브러리의 코루틴에 관한 글

C++에서도 coroutine & yield  http://gamedevforever.com/209

다시 한번 C++에서도 coroutin   http://www.gamedevforever.com/289

</참조>

 

<참조>

Boost 라이브러리의 asio::spawn 관련 예제 코드

http://www.boost.org/doc/libs/1_54_0/doc/html/boost_asio/example/cpp11/spawn/

</참조>

 

by 흥배 2014.07.07 08:00

packaged_task를 사용하면 병렬 프로그래밍 패턴의 task 패턴과 같이 Asio에서 백그라운드 작업을 처리할 수 있다.





< ioservice.post packaged_task 사용하기 >

 

완전한 코드는 'io_service_post_packaged_task' 프로젝트를 참조하기 바란다.


io_service_post_packaged_task.zip


 

by 흥배 2014.07.03 08:00
| 1 2 3 4 ··· 7 |