일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
- c++ heap
- 백준
- LOB
- JUCE 튜토리얼
- OS
- 공룡책
- 운영체제
- 자료구조
- C++ library
- 연결리스트
- C++ gui 라이브러리
- JUCE
- gui
- C++
- Nebula
- BOJ
- go
- 리듬게임
- JUCE라이브러리
- 알고리즘
- 코딩
- C언어
- JUCE library
- 프로그래밍
- tour of go
- C++ gui
- go channel
- Docker
- vim-go
- a tour of go
- Today
- Total
목록Programming (154)
CafeM0ca
들어가는 시점만 알면 된다.123456789101112131415161718192021222324252627282930313233343536373839404142434445464748#include #include using namespace std;int arr[51][51] {0};int t,m,n,k;int cnt;void search(int x,int y){ if(arr[y][x]){ arr[y][x] = 0; if(x > 0) search(x-1,y); if(x 0) search(x,y-1); if(y > t; for(int a = 0; a > m >> n >> k; for(int i = 0; i > x >> y; arr[y][x] = 1; } for(int i =0; i
컴포넌트의 getWidth()와 getHeight()는 생성자에서 결정되지 않는다. 왜냐하면 자식 컴포넌트는 부모 컴포넌트의 크기를 모른다.생성자의 순서를 보면 자식컴포넌트부터 초기화 되기 때문이다.따라서 resize함수에서 범위를 설정해주는게 현명한것이다.
상수표현식. 상수값이 요구되는 곳에 상수 표현식을 사용한다. 다음 코드는 C++에서 오류로 처리된다. const를 constexpr로 바꿔주면 컴파일 오류가 발생하지 않는다. constexpr은 const와 마찬가지로 컴파일 타임에 계산된다.constexpr을 사용하면 컴파일러가 최적화를 훨씬 효과적으로 할 수 있다. 단, 함수를 constexpr로 선언하려면 다음과 같이 꽤 많은 제약 사항을 지키자.- 함수의 본체는 한 개의 리턴문으로 만들어져야하고 goto문이나 try/catch 블록이 포함되면 안되며 예외를 발생시켜도 안된다. 단, 다른 constexpr을 호출하는것은 허용된다.- constexpr으로 선언하려는 대상이 클래스의 멤버 함수일 경우 그 메서드는 virtual로 선언될 수 없다.- 모든..
C++에는 우측값이라는 개념이 존재한다. 우측값? 좌측값? int main() { int a = 1; // a는 좌측값 1은 우측값 int& ref = a; // ref는 좌측값 a도 우측값이면서 좌측값 return 0;} 위 코드에서 a는 왼쪽에 있어서 좌측값이다. 1은 오른쪽에 있어서 우측값이다.다음줄에 ref는 왼쪽에 있어서 좌측값이다. a는 오른쪽에서 있어서 우측값이지만 a = 1을 통해 동시에 좌측값이다.따라서 a는 우측값이면서 좌측값이다.그럼 1 = a;를 생각해보자. 컴파일에러가 뜬다.1은 우측값이며 좌측값이 아니다. 위 내용을 토대로 다음과 같은 명제가 성립한다.모든 좌측값은 동시에 우측값이지만 모든 우측값은 좌측값이 아니다. 그럼 '무엇이 우측값인가?'에 대한 질문에 대한 답변은 '임시 ..
후배가 추천해줘서 JUCE 연습용으로 만들었다. https://github.com/jinykim0x80/Tic-Tac-Toe 게임이 종료되면 재시작이나 나머지 버튼 클릭 비활성화 처리는 안되어있는데 나중에 처리해야겠다.
재밌는 영상을 봐서 정리해본다. reverse OOP- .h와 .cpp파일을 나눠쓰는 C++의 특성을 이용하여 상속관계에서 발생하는 virtual함수의 단점을 없앤다. 주로 게임엔진에서 씀. 위 영상을 보고 적당한 예시를 생각해보았다. 멀티플랫폼을 대상으로 작업해본게 없어서 적당한지는 모르겠지만 아무튼. 예를 들어 어떤 멀티플랫폼용 프로그램에서 간단하게 콘솔화면을 정리해주는 함수를 사용하게 되었다고 가정하자.윈도우에서는 system("cls") 를 사용하고 리눅스에서는 system("clear") 를 사용한다.환경에 맞춰서 제공해주기 위해 다음과 같이 상속했다. 일반적으로 자식 클래스들은 플랫폼 입맛에 맞게 consoleclean() 가상함수를 오버라이딩 할 것이다. (그러나 우리는 가상함수가 느리다는 ..
virtual 키워드는 클래스간 상속에서 자식 클래스가 부모 클래스의 함수를 오버라이딩 특성을 제어하고자 할 때 사용한다. 묻따말 코드부터 보자 출력결과부모 클래스로 Super가 있고 자식 클래스로 Sub은 public으로 Super를 상속하는데잠시 삼천포로 빠져 접근지시자에 대한 설명을 하자면public으로 상속받으면 Super에 public멤버에 접근 가능하다. 나머지는 다 privateprivate 부모 클래스의 public,protected,private가 private로 바뀜 protected 부모 클래스의 private,protected가 private로 바뀜 public 부모클래스의 private가 private로 바뀜 즉 public으로 상속받으면 protected까지 접근 가능하다는 이야..
pimpl은 매번 인터페이스와 구현 클래스를 만든다.구현 클래스는 원래 만들던 방식의 클래스랑 같다.인터페이스 클래스는 구현 클래스의 public 메서드만 담는다.인터페이스 클래스의 메서드들은 단순히 구현 클래스의 메서드 호출을 중계하는 역할을 한다.인터페이스 클래스는 단 하나의 데이터 멤버로 구현 클래스의 포인터를 가진다. 이렇게 클래스를 분리하면 구현 클래스가 어떻게 바뀌든 public 인터페이스 클래스에는 변화가 없으므로 컴파일을 다시 해야 할 필요를 줄일 수 있다.즉, 구현 부분이 어떻게 바뀌든 인터페이스만 그대로라면 사용자로서는 컴파일을 다시 할 필요가 없다.컴파일 종속성의 배제는 구현 클래스의 객체를 인터페이스 클래스가 포인터로 가질 때만 유효하다. 이러한 테크닉은 인터페이스와 구현을 완전히 ..
이름부터 귀여운 댕글링 포인터(dangling pointer)는 내면을 파해쳐보면 전혀 귀엽지 않다. 다음과 같은 코드가 있다고 가정하자. n을 동적할당해서 1을 가리키게한다.p는 n이 동적할당한 값 1을 가리키게한다. n은 역할을 다 하고 동적할당을 해제하고 안전하게 nullptr로 만들어 주었다.ㄴ그러나 ptr은 여전히 n이 '가르켰던' 값을 가리키고 있다. 해제된 메모리를 가리키고 있는셈. 출력결과 Use After Free(UAF) 취약점이 발생한다.
처default와 delete는 각각 switch case구문과 new의 짝궁으로 사용되었다. C++은 오버로딩 기능이 있다보니 생성자를 여러개 만들 수 있다.그 중에서도 default 생성자가 있는데 흔히 클래스이름() { } 처럼 생겼다. 디폴트 생성자임을 명시해주기 위해서 다음과 같이도 사용한다. 그리고 디폴트 생성자에 delete 키워드를 사용하면 클래스이름 변수이름; 처럼 사용이 불가능해진다.(디폴트 생성자가 호출되지 않기 때문) \main 함수의 a가 컴파일 에러를 보여주고 있다. default와 delete는 디폴트 복사 생성자와 디폴트 대입 연산자에서도 사용 가능하다.다음과 같은 코드가 있을 때, 실행결과각각의 클래스 변수들의 주소는 제각각이지만 값들은 똑같다.a1은 디폴트 대입 연산자로 ..