static_cast 와 dynamic_cast

Programming/C++ Language 2015. 1. 7. 11:16

static_cast

: 컴파일러에게, 모든 형 변환에 대해 허용하도록 해주는 구문. 이 형변환에 대한 모든 책임은 프로그래머가 진다.

Car* pCar = new Truck();

Truck* pTruck = static_cast<Truck*>pCar;

pTruck->drive();

정상동작.

Car* pCar = new Car();

Truck* pTruck = static_cast<Truck*>pCar;

pTruck->drive();

비정상동작.

: 따라서, 정말 필요한 경우에만 제한적으로 사용하는 것이 좋다.

: 부모 포인터를 자식 포인터로 변환할때, 의도적으로 한다는 것을 표현할때 좋다.


dynamic_cast

: 상속관계에서의 안전한 형 변환

: 자식 객체의 포인터 및 참조형 변수를 부모형 포인터 및 참조형 변수로 형 변환 해주는데 사용 된다.

Car* pCar = new Truck();

Truck* pTruck = dynamic_cast<Truck*>pCar;

컴파일 에러

Car* pCar = new Car();

Truck* pTruck = dynamic_cast<Truck*>pCar;

컴파일 에러

Car* pTruck = new Truck();

Car* pCar = dynamic_cast<Truck*>pTruck;

컴파일 성공

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

warning 에 대하여  (0) 2015.01.07
typeid 키워드  (0) 2014.04.15
Unique Pointer  (0) 2014.03.03
[C++] 동적바인딩( Dynamic binding )  (0) 2011.01.03
[C++] this 포인터 사용하기  (0) 2010.07.31

설정

트랙백

댓글

warning 에 대하여

Programming/C++ Language 2015. 1. 7. 11:05

1. field 'A' will be initialized after field 'B' [ -Wreorder ]


A가 B 다음에 초기화 될 거라는 경고 이다.Class 의 변수는 생성자에 나열된 순서대로 초기화 되는 것이 아니라, Class 에 선언된 순서대로 초기화가 된다. 따라서 A 와 B 가 다른 변수에 의존적으로 초기화가 될 경우, 의도치 않은 값으로 초기화가 되는 것을 방지하기 위한 경고이다.

Class TestClass{ int A; int B; }

TestClass() : B(n++), A(n++)

위와 같은 코드에서 n이 10일 경우, B에 10, A에 11이 들어가도록 의도적으로 개발을 했다고 할 경우

실제 결과는 A가 10이고 B가 11이 된다.


2. Suppressing warning


switch case 를 사용할 때, 의도적으로 break 를 빼는 경우가 있는데 

이때 컴파일러에서 no break at the end of case 라는 경고를 보여준다. 

이를 없애기 위해서는 eclipse 에서는 해당 경고에 마우스 오른쪽을 누르면 "Customize Problem..." 이라는 메뉴가 있다. 

여기에 보면 Comment text to suppress the problem 이라는 란이 있는데, 

여기에 있는 텍스트가 해당 경고가 표시되는 부분에 주석으로 포함되어 있으면 해당 경고가 사라지게 된다. 

switch(value){ 

case 1: 

... 

// no break

case 2:

break;

}


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

static_cast 와 dynamic_cast  (0) 2015.01.07
typeid 키워드  (0) 2014.04.15
Unique Pointer  (0) 2014.03.03
[C++] 동적바인딩( Dynamic binding )  (0) 2011.01.03
[C++] this 포인터 사용하기  (0) 2010.07.31

설정

트랙백

댓글

typeid 키워드

Programming/C++ Language 2014. 4. 15. 13:36

typeid 키워드는 런타임에 오브젝트의 클래스를 결정하기 위해 사용 된다. std::type_info 오브젝트를 리턴한다.( 프로그램 종료까지 유지 되는 값 ) 단순히 class 정보만이 필요할 경우에, dynamic_cast<class_type> 보다는 typeid 를 사용하는 것을 선호한다.( typeid 의 수행속도가 짧음 )


#include <iostream>    // cout
#include <typeinfo>  //for 'typeid'
 
class Person {
public:
   // ... Person members ...
   virtual ~Person() {}
};
 
class Employee : public Person {
   // ... Employee members ...
};
 
int main() 
{
   Person person;
   Employee employee;
   Person* ptr = &employee;
   Person& ref = employee;
   // The string returned by typeid::name is implementation-defined
   std::cout << typeid(person).name() << std::endl;   // Person (statically known at compile-time)
   std::cout << typeid(employee).name() << std::endl; // Employee (statically known at compile-time)
   std::cout << typeid(ptr).name() << std::endl;      // Person* (statically known at compile-time)
   std::cout << typeid(*ptr).name() << std::endl;     // Employee (looked up dynamically at run-time
                                                      //           because it is the dereference of a
                                                      //           pointer to a polymorphic class)
   std::cout << typeid(ref).name() << std::endl;      // Employee (references can also be polymorphic)
 
   Person* p = nullptr;
   try {
      typeid(*p); // not undefined behavior; throws std::bad_typeid
                  // *p, *(p), *((p)), etc. all behave identically
   }
   catch (...)
   {}
 
   Person& pRef = *p; // Undefined behavior: dereferencing null
   typeid(pRef);      // does not meet requirements to throw std::bad_typeid
                      // because the expression for typeid is not the result
                      // of applying the unary * operator
}

Output (exact output varies by system):

Person
Employee
Person*
Employee
Employee

출처 : http://en.wikipedia.org/wiki/Typeid

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

static_cast 와 dynamic_cast  (0) 2015.01.07
warning 에 대하여  (0) 2015.01.07
Unique Pointer  (0) 2014.03.03
[C++] 동적바인딩( Dynamic binding )  (0) 2011.01.03
[C++] this 포인터 사용하기  (0) 2010.07.31

설정

트랙백

댓글

Unique Pointer

Programming/C++ Language 2014. 3. 3. 14:59



Related


template <class T>

class rv

{

    T& r_;


public:

    explicit rv(T& r) : r_(r) {}

    T* operator->() {return &r_;}

    T& operator*() {return r_;}

};


template

rv<int> intRV; 와 같이 <> 안에 자료형을 넣어 T를 해당 자료형으로 변환 시켜준다.


explicit

class 생성자의 묵시적 호출을 방지하는 키워드.

int a;

rv<int> classRV = a;

위와 같이 호출을 하였을 때, 컴파일러가 암묵적으로 classRV(a) 를 호출해주는 것을 방지한다. 이로인해 의도치 않은 동작을 방지 할 수 있다.

생성자를 호출하기 위해서는 반듯이 rv<int> classRV(a) 와 같이 호출이 되어야 한다.



typename


typedef typename add_reference<deleter_type>::type deleter_reference;


typedef 는 기존 정의된 자료형사용자 정의 자료형으로 이름을 부여할 때 사용한다.

따라소 자료형 만이 다음에 올 수가 있는데, 위의 코드에서는 add_reference<deleter_type>::type 이 있는데 이는 변수가 될 수도 있고 자료형이 될 수도 있다. 따라서 컴파일러에게 혼돈을 주게되므로, 컴파일러에게 ~::type 은 자료형이라는 것을 알려주기 위해 사용하는 키워드이다.

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

warning 에 대하여  (0) 2015.01.07
typeid 키워드  (0) 2014.04.15
[C++] 동적바인딩( Dynamic binding )  (0) 2011.01.03
[C++] this 포인터 사용하기  (0) 2010.07.31
[C++] 참조 변수  (1) 2010.07.31

설정

트랙백

댓글

[안드로이드] layout xml - layout_height/weigh

Programming/Android 2012. 1. 14. 13:40

public static final int FILL_PARENT

Since: API Level 1

API Level 8 부터 더 이상 쓰지 않는다고 한다. Level8 부터는 fill_parent 대신에 match_parent 를 사용한다.

public static final int MATCH_PARENT

Since: API Level 8

부모 view의 크기를 의미하며, 부모의 padding 만큼 사이즈가 줄인다. API Level 8 부터 사용이 가능하다.

public static final int WRAP_CONTENT

Since: API Level 1

내부 content 크기 만큼에 맞춰 사이즈를 정의하게 된다.
TextView를 예를 들면, 한줄의 텍스트가 들어가게 되면 한줄 텍스트의 사이즈 만큼 크기가 결정되고, 두줄의 텍스트가 들어가게 되면 두줄 텍스트의 사이즈만큼 크기가 결정된다.


 

설정

트랙백

댓글

[안드로이드] Android requires compiler compliance level 5.0 or 6.0. Found '1.7' instead. Please use Android Tools > Fix Project Properties.

Programming/Android 2011. 12. 31. 11:21
예제를 받고 처음 실행하려니 이런 문구가 뜨네요.

해결방법은 아래와 같습니다.

프로젝트에 마우스 오른쪽을 누르고 Android Tools > Fix Project Properties 를 선택하고, 다시 실행하면 됩니다.

 

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

[안드로이드] layout xml - layout_height/weigh  (1) 2012.01.14
AVD 실행 문제  (0) 2011.12.29

설정

트랙백

댓글

AVD 실행 문제

Programming/Android 2011. 12. 29. 12:59
AVD 를 만들고, Launch 를 하고 나면 아래와 같이 에러메시지가 발생하는 경우가 있다.

"[2011-12-29 12:44:06 - Emulator] PANIC: Could not open AVD config file: C:\Users\諛뺤쭊��.android\avd\MyAVD.avd/config.ini"  

사용자의 이름이 한글로 되어 있어 발생하는 문제이다.

AVD를 "MyAVD" 로 만들어놓았는데, 이 설정 파일을 C:\로 옮기도록 한다.

나 같은 경우 "C:\Users\사용자이름\.android\avd" 경로에 MyAvd 라는 폴더가 있다.

이 폴더를 C:\ 로 옮기고, cmd를 실행하여 AVD 설치 경로인 이 경로로 이동을 한다. "C:\Program Files\Android\android-sdk\tools" 

그리고 난 뒤에 "android move avd -n MyAVD -p C:\MyAVD" 이렇게 명령을 입력하면
AVD 'MyAVD' moved. 라는 메시지와 함께 경로가 C:\MyAVD 로 옮겨진것을 알수 있다.

이제 AVD를 Launch 하게 되면 정상적으로 실행될 것이다. 

설정

트랙백

댓글

단축키

Programming/C# Language 2011. 2. 25. 11:27
Ctrl + O
 : 해당 파일에서 사용하는 함수목록 보여줌

Ctrl + Tab
 : A.h / A.cpp 간 이동

Ctrl + Shift + E
 : 현재 열려 있는 전체 파일 리스트를 보여줌

Ctrl + E
 : 현재 탭에 열려 있는 파일 리스트를 보여줌

Ctrl + J
 : 창을 열지 않고, 파일 검색.( eclipse 아래에 검색어가 표시 됨 )

Ctrl + H
 : 전체 검색

Ctrl + F
 : 검색창 띄우기

Ctrl + K
 : 이미 한번 찾은 상태에서, 다음 찾기

Ctrl + Shift + K
 : 이미 한번 찾은 상태에서, 이전 찾기

F3
 : 해당 메서드나 클래스가 정의 된 곳으로 이동

Ctrl + Shift + ↑ / + ↓
 : 이전 / 다음 메서드로 이동

'Programming > C# Language' 카테고리의 다른 글

[C#] Drag & Drop  (0) 2011.02.25

설정

트랙백

댓글

[C#] Drag & Drop

Programming/C# Language 2011. 2. 25. 11:19

DragEnter event

- 마우스가 Control 위로 올라 갔을 경우, 마우스 아이콘 모양

e.Effect = DragDropEffects.Copy;
e.Effect = DragDropEffects.None;
DragDrop event

- Control의 Drop된 파일/폴더의 전체경로 및 파일/폴더 명 얻기.
var fullPath = (String[])e.Data.GetData(DataFormats.FileDrop)
path.Substring(path.LastIndexOf('\\') + 1 );

'Programming > C# Language' 카테고리의 다른 글

단축키  (0) 2011.02.25

설정

트랙백

댓글

[C++] 동적바인딩( Dynamic binding )

Programming/C++ Language 2011. 1. 3. 15:53
virtual 함수에 대해서 이야기를 해보겠습니다.

많은 개발자들이 상속을 사용하면서, virtual 함수도 많이 사용을 하게 되는데 virtual 함수를 사용함에 있어 실수 할 수도 있을 부분에 대해서 말해보겠습니다.

bool compare_garades( Core c1, Core c2 )
{
    return c1.grade() < c2.grade();
}

위와 같은 코드가 있고, Core라는 Base class가 있고, grade라는 virtual 함수가 있고, Core를 상속받는 Grad 라는 클래스가 있고, Grad 클래스는 grade함수를 오버라이드하여 재정의를 했다는 것을 전제 조건으로 설명하겠습니다.

실행할 virtual 함수를 런타임에 선택하는 것은 그 함수가 레퍼런스나 포인터를 통해 호출 될 때에만 가능한 것입니다. 하지만 객체 자체에 대한 virtual 함수를 호출하면 컴파일 시에 그 객체의 정확한 타입을 결정할 수 있습니다. 따라서 위와 같은 경우, Core라는 객체의 정확한 타입을 알수 있기 때문에 c1과 c2에 실제로 Grad함수가 전달이 되더라도, 매개변수가 객체에 대한 레퍼런스가 아니라, 객체 그 자체이므로 Grad객체의 Core파트만 잘라내어 그에 대한 복사본이compare_grades 함수의 매개변수로 전달이 되게 됩니다. 즉, 정적 바인딩이 수행되는 것입니다.

출처 : Accelerated C++

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

typeid 키워드  (0) 2014.04.15
Unique Pointer  (0) 2014.03.03
[C++] this 포인터 사용하기  (0) 2010.07.31
[C++] 참조 변수  (1) 2010.07.31
[C++] 참조 반환  (0) 2010.07.31

설정

트랙백

댓글