Programming/C++ STL2014.02.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
crt0.o / crtexe.obj  (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.02.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++ constructor  (0) 2014.02.26
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++11 Lambda Fuction  (2) 2013.11.20
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 구차니

댓글을 달아 주세요

  1. 람다식 ~ 참 편하다는데.. 많이 써야 문법이 익숙해지는거 같아요.

    2013.11.20 17:27 신고 [ ADDR : EDIT/ DEL : REPLY ]
    • 람다라는게 딱 와닫지 않아서요 ㅠㅠ
      lisp 공부할때 처음 알게 되긴했는데 C++ 을 안쓰다 보니..(임베디드라 C만..) 모르겠어요 ㅋㅋ

      2013.11.20 18:03 신고 [ ADDR : EDIT/ DEL ]

Programming/C++ STL2013.10.08 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++ AMP (Accelerated Massive Parallelism)  (0) 2013.10.08
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.03.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/]

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

C++11 Lambda Fuction  (2) 2013.11.20
C++ AMP (Accelerated Massive Parallelism)  (0) 2013.10.08
c++ class - friend  (0) 2013.03.15
visual studio express 에서 class 생성예제  (0) 2013.03.13
visual studio express에서의 상속 클래스  (0) 2013.03.13
다중상속의 문제점  (0) 2013.03.11
Posted by 구차니

댓글을 달아 주세요

Programming/C++ STL2013.03.13 20:31

1. 컨스트럭터가 하나라도 생성(오버로드) 되면 기본 생성자가 사용불능이 되기 때문에
   필요한 생성자들을 모두 만들어 주어야 한다. 
class abc
{
public:
int a;
abc(int);
// abc();
};

abc::abc(int val)
{
a = val;
} 
abc a; // error C2512: 'abc' : 사용할 수 있는 적절한 기본 생성자가 없습니다.

이러한 문제를 해결하기 위해서는 인자를 가지지 않는 생성자를 만들어야 한다.
class abc
{
public:
int a;
abc(int);
abc();
};

abc::abc(int val)
{
a = val;
}

abc::abc()
{
a = 0;
} 

 
2. 당연한(?) 것이지만 클래스 이름과 동일한 변수는 만들수 없다.
클래스 이름과 동일한 식별자는 '생성자'로 할당되기 때문
class abc
{
public:
int abc;
}; 
error C2039: 'a' : 'abc'의 멤버가 아닙니다.

3. 상속의 경우 상속된 내용에 대해서는 컨스트럭터가 적용된다.
class abc
{
public:
int a;
abc(int);
abc();
~abc();
};

abc::abc(int val) {a = val;}
abc::abc() {a = 2;}
abc::~abc() {cout << "die\n";}

class bbc : public abc
{
public:
int b;
};

int _tmain(int argc, _TCHAR* argv[])
{
abc a;
bbc b;

a.a = 1;
b.b = 2;
cout << b.a << "\n";
b.a = 3;
cout << b.a << "\n";
return 0;
} 

결과는
2
3
die
die 
Posted by 구차니

댓글을 달아 주세요

Programming/C++ STL2013.03.13 20:18
눈으로만 보다 손으로 직접 코딩 -ㅁ-
몇줄 안되는데 막상 직접하려니 은근 까다롭네...
using namespace std;

class abc
{
public:
	int a;
};

class bbc : public abc
{
public:
	int b;
};

int _tmain(int argc, _TCHAR* argv[])
{
	abc a;
	bbc b;

	a.a = 1;
	b.b = 2;
	b.a = 3;
	return 0;
} 

디버거 돌리니까 아래와 같이 나오는데
중첩구조체 라는 느낌인데 약간의 차이(?) 라면
c 에서 b.abc.a 식으로 접근하던걸 b.a 로 상속된 항목에 접근할 수 있다는 정도?


Posted by 구차니

댓글을 달아 주세요

Programming/C++ STL2013.03.11 19:07
계륵이라는 느낌
일단 내용만 보고 느껴지는 문제는
다중상속시 다른 클래스들을 파악해야 하므로
모듈/캡슐화를 통해 모르고 끌어쓰는 편리함을 포기해야 한다는 점?

물론 평행다중 상속이 아닌
수직다중 상속 같운 경우에도 scope문제로 바뀔뿐
재사용성을 위한 상속이 재사용성을 해치는 문제가 발생한다

[링크 : http://gyumee.egloos.com/3200829
[링크 : http://www.winapi.co.kr/clec/cpp3/29-3-2.htm]
[링크 : http://www.langdev.org/posts/20]
[링크 : http://cplusplus.com/doc/tutorial/inheritance/
Posted by 구차니

댓글을 달아 주세요

Programming/C++ STL2013.03.11 19:04
포인터 변수 같은 느낌?

class deri : public a,b
에서
a는 public
b는 private로 된다고 하니 주의해야할듯

[링크 : http://www.gpgstudy.com/forum/viewtopic.php?topic=11211]

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

visual studio express에서의 상속 클래스  (0) 2013.03.13
다중상속의 문제점  (0) 2013.03.11
상속시 public, private 키워드는 하나씩만 적용된다  (0) 2013.03.11
c++ function overloading  (2) 2013.03.04
c++ class member function  (0) 2013.03.04
c++ namespace  (0) 2013.03.04
Posted by 구차니

댓글을 달아 주세요

Programming/C++ STL2013.03.04 23:35
영어사전을 뒤져보면, overriding은 우선시 되서 하는 것이고 overloading은 과적이다.
overriding이 상속으로 함수의 내용을 갈아 엎는걸 의미하는 것을 보면 '최우선시'가 적당한것 같고
overloading은 하나의 이름으로 여러가지 일을 하는 것이니 '과적'도 적당한것 같고

그런데 막상 단어만 두면 엄청 헷갈리는 녀석이다 -_-

overriding 미국식 [|oʊvər|raɪdɪŋ] play 영국식 [|əʊvə|raɪdɪŋ] play 
다른 무엇보다 더 중요한, 최우선시 되는
overloading
(조선공학) 과적(過積)(고봉싣기)  



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

CRectangle::CRectangle () {
width = 5;
height = 5;
}

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

int _tmain(int argc, _TCHAR* argv[])
{
CRectangle rect (3,4);
CRectangle rectb;
cout << "rect area: " << rect.area() << endl;
cout << "rectb area: " << rectb.area() << endl;
return 0;
}  

일단 overloading의 제약사항은 아래의 세가지 이다.
동일 return type
동일 function name 
다른 function variable

c++의 동적 타입 바인딩을 통해서
컴파일 / 런타임 시에 입력받는 변수형을 추적하여 해당 함수로 연결해줄수 있지만
리턴되는 값이 들어가는 곳에 대해서는 형변환이 있을수도 있으니 어떤걸로 할 수 없으니 사용이 불가능 하다고
들은거 같긴한데 먼소리인지 모르겠고 -_- 

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

다중상속의 문제점  (0) 2013.03.11
상속시 public, private 키워드는 하나씩만 적용된다  (0) 2013.03.11
c++ function overloading  (2) 2013.03.04
c++ class member function  (0) 2013.03.04
c++ namespace  (0) 2013.03.04
c++ class와 struct  (0) 2013.03.03
Posted by 구차니

댓글을 달아 주세요

  1. 잘 보고 갑니다.
    아무쪼록 평안한 하루 되시기 바랍니다.

    2013.03.05 12:03 신고 [ ADDR : EDIT/ DEL : REPLY ]