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

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

 

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

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

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 |

티스토리 툴바