'Programming/C++ STL'에 해당되는 글 66건

  1. 2014.03.05 try - throw - catch
  2. 2014.03.04 연산자 오버로딩
  3. 2014.02.28 c++ explicit
  4. 2014.02.28 c++ class / const member variable & function
  5. 2014.02.27 deep copy / shallow copy < object copy
  6. 2014.02.27 crt0.o / crtexe.obj
  7. 2014.02.26 c++ constructor
  8. 2013.11.20 C++11 Lambda Fuction 2
  9. 2013.10.08 C++ AMP (Accelerated Massive Parallelism)
  10. 2013.03.15 c++ class - friend
Programming/C++ STL2014. 3. 5. 22:49
java와 같은 그런 정교한 예외처리는 아닌거 같아서 조금 실망
물론..cpp가 java보다 거의 20년 전 꺼라는걸 감안하면...

아무튼.. try{} 안에 문제점이 될 부분에서
문제점에 대한 if문을 하고 throw를 통해 (물론 타입별로 catch 문을 중첩가능함) 제어의 흐름을 통일 시킨다.
과거에는 수 많은 return문으로 구현하거나
에러발생시 끝부분으로 goto 하는걸 문법적으로 깔끔하게 구현한 셈

#include < iostream >
using namespace std;
int main(int argc, char **argv)
{
		int a = 12;
		int b = 1;
		double c = 0;

		try
		{
			if(b == 0) throw(b);
			else throw(c);
		}
		catch(int e)
		{
			cout << "divide by zero. throw " << e << endl;
		}
		catch(double e)
		{
			cout << "good job. throw " << e << endl;
		}

        return 0;
}

스탠다드 라이브러리로 존재한다.
#include <exception>
[링크 : http://www.cplusplus.com/reference/exception/exception/ ] 

'Programming > C++ STL' 카테고리의 다른 글

c -> cpp 추가사항  (0) 2014.03.10
오버로딩 / 오버라이딩  (0) 2014.03.10
연산자 오버로딩  (0) 2014.03.04
c++ explicit  (0) 2014.02.28
c++ class / const member variable & function  (0) 2014.02.28
Posted by 구차니
Programming/C++ STL2014. 3. 4. 23:10
연산자 오버로딩은 2가지 방법으로 사용이 가능한데
1. 외부함수를 friend로 허용 (2항)
2. 내부함수로 구현(1항)


외부 함수의 경우 2개의 값이 있어야 연산이 가능하기에 인자가 두가지 들어가지만
내부 함수로 구현할 경우 자기 자신을 기준으로 다른 값을 연산하기에 하나의 값만 받게 된다.

#include < iostream >

using namespace std;

class temp
{
public:
        int a;

        temp(int b) : a(b) {}
        int operator+(int b, int c) { a += b; return a; }
};

int main(int argc, char **argv)
{
        temp tt(1);
        cout << tt + 3;

        return 0;
}

위 소스는 의도적으로 내부함수에 대해서 2개의 인자를 주고 생성한 것이라 에러가 발생한다.
VS2008
 error C2804: 이항 'operator +'에 매개 변수가 너무 많습니다.

G++
 error: ‘int temp::operator+(int, int)’ must take either zero or one argument 


정상작동하는 소스, int operator+는 멤버함수로 구현 friend int operator+는 외부함수/friend 로 구현
#include < iostream >

using namespace std;

class temp
{
public:
        int a;

        temp(int b) : a(b) {}
//      int operator+(int b) { a += b; return a; }
        friend int operator+(temp t, int b)
        {
                t.a = t.a + b;
                return t.a;
        }
};

int main(int argc, char **argv)
{
        temp tt(1);
        cout << tt + 3;

        return 0;
}

'Programming > C++ STL' 카테고리의 다른 글

오버로딩 / 오버라이딩  (0) 2014.03.10
try - throw - catch  (0) 2014.03.05
c++ explicit  (0) 2014.02.28
c++ class / const member variable & function  (0) 2014.02.28
deep copy / shallow copy < object copy  (0) 2014.02.27
Posted by 구차니
Programming/C++ STL2014. 2. 28. 11:01
class_name a;
a =  val;

이런식으로 암시적으로 형 변환을 할 경우에 대해서
제한을 걸어 예측이 힘든 버그들을 막아주는 역활을 한다고 한다.

[링크 : http://opensw.wikidot.com/cpp-fundamentals-explicit]
[링크 : http://msdn.microsoft.com/en-us/library/h1y7x448.aspx]

'Programming > C++ STL' 카테고리의 다른 글

try - throw - catch  (0) 2014.03.05
연산자 오버로딩  (0) 2014.03.04
c++ class / const member variable & function  (0) 2014.02.28
deep copy / shallow copy < object copy  (0) 2014.02.27
crt0.o / crtexe.obj  (0) 2014.02.27
Posted by 구차니
Programming/C++ STL2014. 2. 28. 10:35
const 멤버변수는 초기화가 불가능 하지만 클래스에서 값을 준채로 초기화 할 수 없기에
 constructor(variables ...) : const variable(parameter) 

생성자에서 : 키워드를 이용하여 초기화 한다.(상속이 아니다!!!)
class class_name
{
    const int key; // const member variable

    class_name(int _key) : key(_key)
    {
    }
};  

아무튼.. const 멤버 변수가 하나라도 있으면 모든 생성자에 영향을 주는 듯
class student
{
	const int id;
	int age;
	char name[20];
	char subject[30];

public:
	student()
	{
	}

	student(int _id) : id(_id)
	{

	}

	student(int _id, int _age, char *_name, char *_subject) : id(_id)
	{
		age = _age;
//		id = _id;
		strcpy(name, _name);
		strcpy(subject, _subject);
	}

1>d:\cpp\ch12\ch12\ch12.cpp(13): error C2758: 'student::id' : 생성자 기본/멤버 이니셜라이저 목록에 초기화해야 합니다.
1>          d:\cpp\ch12\ch12\ch12.cpp(7) : 'student::id' 선언을 참조하십시오.
1>d:\cpp\ch12\ch12\ch12.cpp(44): error C2582: 'operator =' 함수는 'student'에서 사용할 수 없습니다. 


+
const 멤버 함수
 ret_type function(parameter ...) const

const 함수 내에서는
값을 조작할 수 없으며(포인터 값 return도 불가)
const 함수만 호출이 가능하다.
 

'Programming > C++ STL' 카테고리의 다른 글

연산자 오버로딩  (0) 2014.03.04
c++ explicit  (0) 2014.02.28
deep copy / shallow copy < object copy  (0) 2014.02.27
crt0.o / crtexe.obj  (0) 2014.02.27
c++ constructor  (0) 2014.02.26
Posted by 구차니
Programming/C++ STL2014. 2. 27. 11:46
객체 복사에 대한 전략이다.

깊은 복사는 캐릭터 배열까지 모든 데이터를 복사하며
얕은 복사는 primitive type 만 복사한다.

얕은 복사의 경우
포인터는 포인터 주소를 복사함으로 2중 delete가 발생할 수 있기에
포인터 사용시에는 new 이후 내용자체를 수작업으로 복사해야 한다.

[링크 : http://en.wikipedia.org/wiki/Object_copy]

'Programming > C++ STL' 카테고리의 다른 글

c++ explicit  (0) 2014.02.28
c++ class / const member variable & function  (0) 2014.02.28
crt0.o / crtexe.obj  (0) 2014.02.27
c++ constructor  (0) 2014.02.26
C++11 Lambda Fuction  (2) 2013.11.20
Posted by 구차니
Programming/C++ STL2014. 2. 27. 11:40
c의 경우 디버깅 시에 crt0.o를 호출하게 되는데
cpp의 경우 crtexe.c 파일로 디버깅이 연결된다.

crt는 C RunTime의 약자인데
crt 대신 다른게 될 줄 알았더니 먼가 싱겁... 


1>  LINK : D:\cpp\ch9\Debug\ch9.exe을(를) 찾을 수 없거나 마지막 증분 링크에 의해 빌드되지 않았습니다. 전체 링크를 수행하고 있습니다.
1>MSVCRTD.lib(crtexe.obj) : error LNK2019: _main 외부 기호(참조 위치: ___tmainCRTStartup 함수)에서 확인하지 못했습니다.
1>D:\cpp\ch9\Debug\ch9.exe : fatal error LNK1120: 1개의 확인할 수 없는 외부 참조입니다.
========== 빌드: 성공 0, 실패 1, 최신 0, 생략 0 ==========  

'Programming > C++ STL' 카테고리의 다른 글

c++ class / const member variable & function  (0) 2014.02.28
deep copy / shallow copy < object copy  (0) 2014.02.27
c++ constructor  (0) 2014.02.26
C++11 Lambda Fuction  (2) 2013.11.20
C++ AMP (Accelerated Massive Parallelism)  (0) 2013.10.08
Posted by 구차니
Programming/C++ STL2014. 2. 26. 10:49
클래스를 생성한뒤 값을 주거나
값을 주어 생성하는 경우 어떻게 다른가 테스트

일단.. operator= 와 같이
할당연산자가 기본으로 생성되어 그런건지 모르겠지만
클래스를 만들고 나서 값을 할당하는 경우와는 또 다르게 움직인다.

그리고 생성자가 마치 할당연산자 같이 작동하는 신기한 현상을 발견...
아아 c++ 어려워 ㅠㅠ

#include < iostream >

using namespace std;

class test
{
	int a1, a2;
	int a;

public:
	test()
	{
	}

	test(int b)
	{
		cout << "constructor called" << endl;
		a = b;
	}

	void dump()
	{
		cout << a1 << ' ' << a2 << ' ' << a << endl;
	}
};

void main()
{
	cout << "tt" << endl;
	test tt;

	cout << "t2(11)" << endl;
	test t2(11);

	cout << "tt = 11" << endl;
	tt = 11;

	cout << "tt = 55" << endl;
	tt = 55;

	tt.dump();
	t2.dump();
}

tt
t2(11)
constructor called
tt = 11
constructor called
tt = 55
constructor called
-858993460 -858993460 55
-858993460 -858993460 11 

생성자를 주석처리하여 실험해보면
operator= 일수도 있다고 연결되는 걸 봐서는... 쩝...
1>error C2679: 이항 '=' : 오른쪽 피연산자로 'int' 형식을 사용하는 연산자가 없거나 허용되는 변환이 없습니다.
1>          'test &test::operator =(const test &)'일 수 있습니다.
1>          인수 목록 '(test, int)'을(를) 일치시키는 동안 

[링크 : https://kldp.org/node/31436]
[링크 : http://skmagic.tistory.com/entry/복사생성자와-대입연산자의-차이]
[링크 : http://msdn.microsoft.com/ko-kr/library/c5at8eya.aspx ]

'Programming > C++ STL' 카테고리의 다른 글

deep copy / shallow copy < object copy  (0) 2014.02.27
crt0.o / crtexe.obj  (0) 2014.02.27
C++11 Lambda Fuction  (2) 2013.11.20
C++ AMP (Accelerated Massive Parallelism)  (0) 2013.10.08
c++ class - friend  (0) 2013.03.15
Posted by 구차니
Programming/C++ STL2013. 11. 20. 09:02
람다라는게 미묘하게 감이 안오는데
어떻게 보면 함수포인터를 넘어서
함수 객체 라고 표현을 해야하나?

간단한 실례로 
auto first = container(50);
auto second = container(60);
first();
second(); 

50
60
50
60 

왜 두번 출력하는진 모르겠지만(아마도 람다 생성하면서 1번?)
람다를 생성후 동일한 함수이지만 다르게 계속 작동 하는걸 보면
감이 올 듯... 말 듯 하다 

compile time 결정은 아닌거 같고
runtime 결정값 같긴한데... 

[링크 : http://goparallel.sourceforge.net/c11-lambda-functions-returns-calls/]

'Programming > C++ STL' 카테고리의 다른 글

crt0.o / crtexe.obj  (0) 2014.02.27
c++ constructor  (0) 2014.02.26
C++ AMP (Accelerated Massive Parallelism)  (0) 2013.10.08
c++ class - friend  (0) 2013.03.15
visual studio express 에서 class 생성예제  (0) 2013.03.13
Posted by 구차니
Programming/C++ STL2013. 10. 8. 09:49
GCN 이 어떤건가 조사하고 있는데
GCN이 openCL / DirectCompute / C++ AMP를 지원한다고 해서 조사를 해보니

[링크 : http://msdn.microsoft.com/ko-kr/library/hh265137.aspx]
[링크 : http://en.wikipedia.org/wiki/C++_AMP]
[링크 : http://www.imaso.co.kr/?doc=bbs/...wr_id=41233] 병렬 프로그래밍 혁신, C++ AMP

DirectCompute는 DirectX의 서브 시스템이고
C++ AMP는 DirectX 11 대 부터 지원하게 된 서브 시스템 및 C++0x 문법으로 확장된 기능으로 생각된다.

[링크 : http://en.wikipedia.org/wiki/C++11] C++0x 에서 명명변경

물론 open standard로 MS에서 제정하였기에 리눅스 GCC에서도 지원할 거라는데
C++ 만 보면 웬지 거부반응이 생기지만..
Massiva Parallelism이 이제 대세고 필수라.. 하....

[링크 : http://stackoverflow.com/questions/9179883/will-gcc-support-c-amp]


'Programming > C++ STL' 카테고리의 다른 글

c++ constructor  (0) 2014.02.26
C++11 Lambda Fuction  (2) 2013.11.20
c++ class - friend  (0) 2013.03.15
visual studio express 에서 class 생성예제  (0) 2013.03.13
visual studio express에서의 상속 클래스  (0) 2013.03.13
Posted by 구차니
Programming/C++ STL2013. 3. 15. 23:24
friend는 접근규칙(스코프?) 지정자로 함수와, 클래스에 지정할수 있다.

friend function의 경우 method가 아닌 일반 함수이면서 특정 class에 접근 권한을 지닌다.
아래의 예제에서 friend 함수인 duplicate의 구현 부분은
CRectangle duplicate() 로
CRectangle CRectangle:duplicate() 가 아님을 유의하며
using namespace std;

class CRectangle {
int width, height;
public:
void set_values (int, int);
int area () {return (width * height);}
// friend CRectangle duplicate (CRectangle);
};

void CRectangle::set_values (int a, int b) {
width = a;
height = b;
}

CRectangle duplicate (CRectangle rectparam)
{
CRectangle rectres;
rectres.width = rectparam.width*2;
rectres.height = rectparam.height*2;
return (rectres);
}

int _tmain(int argc, _TCHAR* argv[])
{
CRectangle rect, rectb;
rect.set_values (2,3);
rectb = duplicate (rect);
cout << rectb.area();
return 0;
}

CRectangle 클래스의 friend 함수를 주석으로 제거하면
friend로 예외처리가 되지 않기 때문에 private 변수인 width와 height에 접근할수 없기에
아래와 같은 에러가 발생하게 된다.
 error C2248: 'CRectangle::width' : private 멤버('CRectangle' 클래스에서 선언)에 액세스할 수 없습니다.
 error C2248: 'CRectangle::height' : private 멤버('CRectangle' 클래스에서 선언)에 액세스할 수 없습니다. 

+ 상속받은 클래스의 경우 어떻게 되나 소스를 개조했는데
상속받은 클래스 형으로 새롭게 함수를 정의하면 의미가 없어지고
단순하게 타입캐스팅도 못하고
상속받을 형으로 duplicate2 함수를 만들려고 하면 재귀적이라서 방법이 없고 -_-
아무튼 상속에 대해서는 friend 함수는 의미가 없으려나?




friend class의 경우
해당 class의 instance로 부터의 접근 권한을 허가한다.
위의 예제와 유사한데, class 내에서 다른 클래스에게 허가권을 주는 형식이다.
using namespace std;

class CSquare;

class CRectangle {
int width, height;
public:
int area () {return (width * height);}
void convert (CSquare a);
};

class CSquare {
private:
int side;
public:
void set_side (int a) {side=a;}
// friend class CRectangle;
};

void CRectangle::convert (CSquare a) {
width = a.side;
height = a.side;
}

int _tmain(int argc, _TCHAR* argv[])
{
CSquare sqr;
CRectangle rect;
sqr.set_side(4);
rect.convert(sqr);
cout << rect.area();
return 0;
} 

friend를 주석으로 제거시 conver 함수에서 sqr.a 에 접근할수 없으므로 아래와 같은 에러가 발생한다.
(sqr은 CSqaure class로 side는 private 변수이다. 그렇기에 CRectangle 클래스인 rect에서는 sqr.a를 접근할 수 없다)
 error C2248: 'CSquare::side' : private 멤버('CSquare' 클래스에서 선언)에 액세스할 수 없습니다.

+
이녀석도 상속하면 어떻게 되려나 궁금해지네...

[링크 : http://www.cplusplus.com/doc/tutorial/inheritance/]
Posted by 구차니