반응형

프로그래밍 215

unresolved externals, undefined reference to A::test()

클래스 static 멤버변수는 클래스내부에서 초기화 할 수 없다. 특히 클래스에서 static 함수는 클래스멤버변수중 static 멤버변수만 사용할 수 있는데, 여기서 주의할점은 static 멤버함수가 static만 사용할 수 있다고해서 초기화까지 가능한 것은 아니다. static 멤버변수는 클래스외부에서 명시적인 초기화가 필요하다. ex) int A::num = 1; 명시적 초기화 후에는 스태틱 멤버함수의 명시적인 사용도 가능하다. undefined reference to A::test() 정의되지 않은 참조 A::test() A::test()가 정의되지 않고서 사용을 하려할 경우. 이럴경우 함수정의부분에 클래스명시를 안한경우다. unresolved externals 에러의원인은 다양하다. 보통 클래스..

위상정렬(topological sort)

위상정렬이란 방향 그래프에서 연결되어 있는 정점을 재귀가 회귀하는 역순서로 정렬하는 것을 말한다. (재귀의 진행의 반대는 재귀의 회귀라고 하자. 진행은 스택에 쌓는작업이고 회귀는 스택을 푸는 작업이라고하자.) 내가 이해하는 대로 쓴것이다. 우선 위상정렬은 탐색과 다르게 탐색할때의 정점을 재귀의 회기시에 반환해서 정렬하는 형태를 말한다. 탐색은 정점에서 다음 노드들 다시말에 정점과 연결된 곳을 재귀진행시에 반환 했었다.(다음노드는 다음탐색의 정점이 되어서 탐색을 진행해 나간다.) 이런위상정렬을 할시 폐쇄로가 있다면 위상정렬의 해는 없어지게된다. 위상정렬을 하기위해선 우선 폐쇄로에대한 판단을 먼저 해야한다. 폐쇄로란, 특정 정점에서 시작해서 회로를 도는중 그 정점으로 돌아오는 경우 폐쇄로로 판정된다. 폐쇄로..

탐색-깊이우선탐색, 너비우선탐색

아래 1부터 7 까지의 노드들이 있다. 이런 노드들을 연결해놓은 아래와 같은 그림을 그래프라고한다. 트리와 그래프의 차이는 트리는 한 노드에서 또다른 노드까지 가는 방법이 1가지인데 반해 그래프는 여러가지방법이 있을 수 있다. 이제 깊이 우선 탐색을 알아보겠는데 깊이란 시작점에서 부채모양으로 퍼진형태가아닌 선형태로 탐색을 하는 것을말한다. 그림에서 1-2-4-7 , 1-2-5-6 이런식으로 탐색해 나가는것이 깊이 우선 탐색이라고 한다. 너비우선탐색은 (1-2 ,1-3) (2-4,2-5) 이런식으로 시작점을 정하면 부채꼴모양으로 가능한 연결수를 다 찾아낸후 다음 탐색을 하는 형태이다. 깊이우선탐색은 시작정점의 변경이 한번의 이동에 한번씩 된다. 하지만 너비우선탐색은 시작정점이 있으면 연결된 노드를 다 탐색..

가상함수 virtual 키워드 C++

클래스 타입의 포인터로 멤버함수를 호출할 때 virtual 키워드의 유무에따라 동작이 달라지게된다. 예를들면 class A { public: void test(){코드1} }; class B : public A{ public: void test(){코드2} }; A *a = new B(); a->test(); //동작1 : 코드1이 실행 동작2 : A클래스의 멤버함수인 test()를 virtual로 선언하면 코드2가 실행 좀더 확실하게 살펴보자 다음과 같이 코드를 작성해보자. A클래스와 A를 상속한 B클래스를 선언한 뒤 Message함수를 만들어 A클래스타입의 포인터 pa를 인수로 하여 A객체와 B객체를 정적/동적바인딩을 해보자. 정적바인딩 동적바인딩(vitual 키워드 사용) vitual 키워드의 유무..

프로그래밍/cpp 2013.06.04

상속과 생성자에 대한 고찰 C++

상속을 하면 자식클래스의 생성자는 어떻게될까? 부모의 생성자가 상속이 될 리는 없다. 우선 생성자의 이름이 다르기때문이다. 기능적인 상속조차 안된다는 것이다. 대신 자식클래스의 객체를 생성하게되면 부모클래스(최고부모까지) 거슬러올라가면서 생성자가 차례로 호출된다. 그럼 인수를 받아서 초기화해야하는 생성자의 경우는 어떤한가? 멤버이니셜라이져를 사용하면된다.

프로그래밍/cpp 2013.06.04

포인터 객체배열 C++

포인터 객체 배열이란? 클래스의 객체의 주소값을 가르키는 포인터들을 담는 배열이다. 간략하게 사용법을 적는다. Storage* Arr[100]; 선언을 한후 초기화는 하지않았다. 배열은 선언후 초기화를 해야하지않나요? 하지만 프로그램의 실행중에 동적으로 생성되는 객체를 무슨수로 초기화할 수 있을까. 그럼 메커니즘을 설명해보겠다. Arr[100] 포인터 배열은 초기화가 안되어있으므로 Arr[0]. Arr[1].... --------------> NULL 을 가르킨다. // 전역변수로 선언시! 배열요소가 비어있는 판단하는 기준은 Arr[i]==NULL 인지를 판단하고 객체의 생성은 new키워드의 동적할당이다. 이렇게 동적할당된 ////////// 포인터배열은 전역변수로 선언시 모든 요소는 NULL로 초기화된..

프로그래밍/cpp 2013.06.04

C프로그램의 메모리모델.(작성중)

C언어로 작성된 프로그램은 주기억장치를 효율적으로 사용하기위하여 보통 64KB 크기의 논리적단위로 나누어서 할당과 할당해제로 관리하게된다. 이 논리적 단위를 세그먼트(segment)라한다. 세그먼트는 코드세그먼트, 데이터세그먼트로 구분해서 사용하고, 데이터세그먼트는 기억장소의 할당방법에 따라 정적세그먼트와 동적세그먼트로 나뉘게된다. 또한 데이터세그먼트는 동적할당에의해 관리되어지는 스택세그먼트, 힙세그먼트,와 정적할당에 의해서 관리되어지는 정적(Data) 세그먼트로 구분되어진다. 데이터세그먼트에 데이터를 저장하기 위해서 할당되어진 기억장소를 변수라고한다. 함수호출문장은(리턴값) 레지스터에 저장이된다. 전처리기나 컴파일러는 컴파일할 때 원시 코드에서 기술되어진 단어나 기호들에대해 의미를 해석하고 처리한다. ..

배열의 특징 C언어

배열의 특징 C언어 배열명은 포인터 상수이다. 포인터 상수는 주소값이 고정이라는 뜻이다. 예외)sizeof 연산자의 피연산자로 사용될 때만은 포인터상수로 취급되지 않고 배열 그자체로 취급된다 배열을 한번에 초기화하고싶다면 선언과 동시에 해야한다. 선언과 동시에 초기화를 할 때, = 는 대입(Operator)가아닌, = 초기화 구두점이다(Punctual) 때문에 선언후에는 한번에 초기화 할 수가 없다. 선언과 동시에 초기화를 안한다면, 배열 요소 하나하나를 직접 입력 해야한다. 상수는 좌변값이 될 수 없기때문에 배열명은 좌변값이 될 수가 없다. 배열 선언시 배열의 크기는 상수로 해야 한다. 배열 선언시 첨자를 변수로 지정한 경우에 값을 집어 넣는 시점에서 문제가 생긴다. 꼭 상수로 해야하지만 C++에선 선..

반응형