본문 바로가기

Programming/C C++

[Visual C++] 가상상속 기반클래스 하나를 두개의 파생클래스가 똑같이 상속받고 이 두개의 파생클래스를 다시 하나의 또 다른 파생클래스가 상속받는 경우class Base class Deri1:public Base class Deri2:public Base class Deri_end:public Deri1, public Deri2 기반클래스(Base)는 이를 상속받는 파생클래스(Deri1, Deri2)마다 하나씩 개별적으로 생성됩니다. 따라서 위와 같은 상속의 형태를 갖게 되는데 이를 위와 같은 형태로 바꾸고자 한다면 가상상속을 구현해야 합니다.class Deri1:public virtual Base { }; class Deri2:public virtual Base { };가상상속은 간단한데 파생클래스에서 기반클래스를 상속받을때 v.. 더보기
[Visual C++] 예외처리 가장 흔히 사용되는 예외처리 대표 구문으로 try ~ catch 문이 있습니다.try { int x = 0; int y = 0; if (x == 0) throw 10; int i = x/y; } catch(int e) { cout 더보기
[Visual C++] 오버라이딩(Overriding) 과 다형클래스 오버라이딩(Overriding) 기반클래스의 멤버함수를 파생클래스에서 재정의하는 것을 의미합니다.class Base { public: virtual int cals(int a, int b); }; int Base::cals(int a, int b) { return a + b; }Base 클래스에서 cals함수를 정의하고 파라메터로 받은 a, b두개의 정수값을 더하여 그 결과를 반환하도록 하였습니다. 이때 clas함수는 virtual 키워드를 사용하여 선언하였는데 이는 파생클래스에서 해당 함수의 기능을 다시 정의할 수 있도록 허용하기 위함입니다.class Deri:public Base { public: int cals(int a, int b); }; int Deri::cals(int a, int b) { .. 더보기
[Visual C++] 함수 템플릿 (Function Template) 두개의 값을 받아 단순히 더해주는 함수를 만들어야 한다고 가정해 보겠습니다.int plus(int i, int j) { return i + j; }그런데 만약 위 함수에서 i와 j의 데이터형이 달라져야 한다면 어떻게 될까요? 새로운 형의 데이터를 처리하는 함수를 만들어 오버라이딩하는 것도 방법이지만 이런 경우 함수 템플릿을 이용하면 좀더 효휼적으로 문제를 해결할 수 있습니다.template T plus(T i, T j) { return i + j; }위의 경우가 plus함수에 템플릿을 적용한 경우입니다. 템플릿은 template 키워드를 사용하며 안에 typename으로 뒤의 식별자가 데이터형임을 지정합니다. 따라서 T가 데이터형이 되며 '어떠한' 데이터형의 매개변수를 받아 동작할지 그 틀을 잡게됩니다... 더보기
[Visual C++] 전처리문(Preprocessor) 전처리란 소스코드를 컴파일하기전 소스코드에 특별한 처리를 행하는 것을 말합니다. 1. #include 소스에 헤더파일이나 기타 소스파일을 포함시킵니다. #include 를 사용하는 방법은 두가지가 있는데 하나는 를 사용하는 것으로 이 경우 해당 파일은 컴파일옵션에 미리 정해진 경로에서 파일을 찾게되며 ""는 현재 소스파일이 위치한 경로에서 지정한 파일을 찾게 됩니다. 이때 만약 파일을 찾지 못하면 없으면 와 같은 경로에서 파일을 찾게 됩니다. 2. #import COM/ActiveX 개발시 자주 사용되는 것으로 형정보를 해당 라이브러리에서 가져오도록 합니다. 3. #using .NET 관련 라이브러리를 참조합니다. 4. #if 다음 형식으로 사용되며#if 조건 //내용 #elif 조건 //내용 #else.. 더보기
[Visual C++] 추상클래스 추상클래스는 순수가상함수를 가진 클래스를 의미합니다. 기반 클래스로부터 상속받는 파생클래스에서는 반드시 기반클래스에 있는 순수가상함수를 재정의 하도록 강제합니다.virtual int cals(int a, int b) = 0;순수가상함수의 선언방식은 위와 같습니다. 가상함수에 =0을 붙이면 되는데 함수에 0을 대입하는것이 아닌 해당 함수를 순수가상함수로 만들겠다는 의미입니다. 클래스가 순수가상함수를 가지게 되면 해당클래스에서는 순수가상함수의 실행부분을 정의할 필요가 없고 클래스에 대한 객체를 생성할 수 없게 됩니다. 오로지 파생클래스에서 기반클래스에 있는 순수가상함수를 재정의하여 실행본체를 작성해야 하고 기반클래스만이 객체를 생성할 수 있게 됩니다.class Base { public: virtual int.. 더보기
[Visual C++] 클래스 템플릿 함수 템플릿처럼 전체적인 구조는 갖지만 데이터형에 따라 다른 취급을 하는 각각의 클래스를 생성할 수 있습니다.template class Base { public: void set_value(T i); T get_value(); private: T j; };클래스에 템플릿을 적용하려면 클래스 머리위에 template 키워드를 사용해야 합니다. 또한 안에 typename을 지정하여 뒤의 식별자가 데이터형임을 나타내도록 합니다. 식별자 T는 클래스 본문에서 필요한 멤버에 붙여 사용합니다. 현재 Base클래스는 T형 변수 j와 이 변수에 값을 저장하기 위한 set_value()함수 그리고 저장된 값을 불러오는 get_value()함수가 선언되어 있습니다.template void Base::set_value(T .. 더보기
[Visual C++] 업/다운 캐스팅 클래스 객체를 기반 클래스로 변환하는것을 업캐스팅, 파생클래스형으로 변환하는 것을 다운캐스팅이라고 합니다. Base 클래스를 기반클래스, Deri 클래스를 기반클래스라고 가정했을 경우Base* b = new Deri();또는Deri* d = new Deri(); Base* b = dynamic_cast(d);위와 같이 하는것이 방법이 업캐스팅이 됩니다. dynamic_cast는 캐스팅 함수로서 dynamic_cast(대상객체); 형식으로 작성됩니다. 다운캐스팅은 dynamic_cast함수를 사용해야 합니다.Base* b = new Base(); Deri* d = dynamic_cast(b);캐스팅을 하기전에 dynamic_cast는 변환이 가능한지에 대한 확인작업을 먼저 하게 되는데 이를 생략하고 곧장 .. 더보기