'Programming'에 해당되는 글 1721건

  1. 2014.03.04 연산자 오버로딩
  2. 2014.02.28 c++ explicit
  3. 2014.02.28 c++ class / const member variable & function
  4. 2014.02.27 deep copy / shallow copy < object copy
  5. 2014.02.27 crt0.o / crtexe.obj
  6. 2014.02.26 c++ constructor
  7. 2014.02.25 const / pointer
  8. 2014.02.17 opencv docs
  9. 2014.02.15 cuda 6.0 rc
  10. 2014.02.08 Interoperability with OpenCV 1
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 Win32 MFC2014. 2. 25. 10:37
c++ 레퍼런스를 보다 보니
포인터에 const가 붙으면 어떻게 접근보호가 될지 궁금해 검색을 해보니 똭! ㅋㅋ

const 포인터
const void *p = &ori;
포인터의 주소 변경 불가(레퍼런스 화?) 내용 변경 가능

포인터 const
void const *p;
포인터 주소 내의 내용  변경 불가

const 포인터 const
const void const *p
포인터 주소 및 주소 내의 내용 변경 불가

[링크 : https://kldp.org/node/48414]
[링크 : http://quoobit.egloos.com/1379839]

+ 특이사항으로는..
const 변수를
포인터로는 조작이 가능하다는거.. 당연한걸지도 모르겠지만... ㄷㄷㄷ 

int main()
{
        const int a = 0;
        int *p;

        p = &a;

        printf("%d %d\n",a,*p);

        *p = 2;
//      a = 1;

        printf("%d %d\n",a,*p);

        return 0;
} 

$ ./a.out
0 0
2 2

어짜피 const는 컴파일 타임에 결정되는 것 이기에
메모리 상에 주소로 접근시에는 해당 메모리 영역이 read-only인지 알 수 없기에
포인터로 (const 포인터 const라면 안되겠지만) const 영역의 데이터를 조작이 가능하다는 놀라운(?) 사실 ㄷㄷ

---
2014.3.5 추가
gcc 에서는 문제없이 되지만 vs2008에서는 에러가 난다. 
1> error C2440: '=' : 'const int *'에서 'int *'(으)로 변환할 수 없습니다.
1>        변환하면서 한정자가 손실됩니다. 

또한 gcc에서 되던 문법이 경고가 발생한다.
const int const *p1;
1> warning C4114: 동일한 형식 한정자를 두 번 이상 사용했습니다.  



'Programming > C Win32 MFC' 카테고리의 다른 글

2중 포인터 사용이유  (0) 2014.03.19
typeof  (0) 2014.03.11
assert()  (0) 2013.12.18
printf의 %s와 %S  (0) 2013.06.15
win32api - joystick 예제  (0) 2013.06.15
Posted by 구차니
Programming/openCV2014. 2. 17. 17:28
예전에 저장을 안해놨던가.?

[링크 : http://docs.opencv.org/]
  [링크 : http://docs.opencv.org/doc/tutorials/tutorials.html] html 버전의 tutorial
  [링크 : http://docs.opencv.org/java/] opencv java api

'Programming > openCV' 카테고리의 다른 글

OpenNI - Open Natural Interaction  (0) 2014.06.30
opencv2 웹캠 관련 문서  (0) 2014.06.28
Interoperability with OpenCV 1  (0) 2014.02.08
opencv2 on ubuntu  (2) 2013.11.10
openCV Mat / iplImage  (0) 2012.02.21
Posted by 구차니
Programming/openCL & CUDA2014. 2. 15. 22:10
아직 함정인가?
링크는 로그인 할 수 없다고 하네?
그나저나 이제야 조금 맛을 보았는데 금세 6.x 대라니 ㅠㅠ


Posted by 구차니
Programming/openCV2014. 2. 8. 23:26
OpenCV 와 OpenCV2는 같은 프로젝트 이지만
새로 갈아 엎으면서 하위호환을 위해 어느정도 제공은 하지만
그래도 만약 새롭게 공부 한다면 c++ 기반의 OpenCV2로 시작을 해야 할 듯 하다.

아무튼 opencv tutorial에 의하면
아래와 같이 기존의 IplImage 와 CvMat 구조체와 호환은 가능하다고 한다.

Mat I;
IplImage* pI = &I.operator IplImage();
CvMat* mI = &I.operator CvMat(); 

'Programming > openCV' 카테고리의 다른 글

opencv2 웹캠 관련 문서  (0) 2014.06.28
opencv docs  (0) 2014.02.17
opencv2 on ubuntu  (2) 2013.11.10
openCV Mat / iplImage  (0) 2012.02.21
openCV 글씨 쓰기 예제  (2) 2012.02.12
Posted by 구차니