2015-01-12 4 views
0

이것은 이해하려고하는 코드입니다. 특별한 용도는 없습니다. 나는 무슨 일이 일어나는지를 이해하려고 노력하고 있습니다.기본 클래스의 파생 클래스 인스턴스

#include<iostream> 
using namespace std; 

class derivedClass; 
class baseClass 
{ 
public: 
    int objID; 
    derivedClass* dcObjPtr; 

    baseClass() 
    { 
     cout << "(1) Default constructor" << objID << endl; 
    } 

    baseClass(int ID) 
    { 
     objID = ID; 
     dcObjPtr = new derivedClass(1); 
     cout << "(2) Constructing base object with ID: " << objID << endl; 
    } 
}; 

class derivedClass : public baseClass 
{ 
public: 
    derivedClass() 
    {} 

    derivedClass(int ID) : baseClass(ID) 
    { 
     cout << "(4) Constructing derived object with ID: " << objID << endl; 
    } 
}; 


int main(int argc, char** argv) 
{ 
    derivedClass dcObj(1); 

    return 0; 
} 

VS2013을 사용하면 "derivedClass : class has no constructors"오류가 발생하는데 올바른 오류라고 생각하지 않습니다.

포인터가 아니라 derivedClass 인스턴스를 처음 사용했습니다. 그리고 그것은 저에게 세미콜론에 대한 이상한 오류를주었습니다. 그런 다음 this post을 보았습니다. 여기서 대답은 인스턴스 대신 포인터가 있어야한다는 것입니다.

  1. 가 왜 생성자에 대해 불평 컴파일러입니다 :

    은 내가 가지고있는 질문입니다. 클래스에는 생성자가 명확하게 있습니다.
  2. 어떻게 작동합니까? dervedClass의 인스턴스를 만들면 기본 클래스 부분이 있습니다. 그리고이 baseClass 부분에는 derivedClass가 있습니다. 이것은 재귀 적입니다. 그것이 작동한다면 그것은 세그먼트 결함이나 그와 같은 결과를 초래할 것이라고 나는 예상 할 것이다. 이것이 재귀적일 것이라고 가정하는 것이 옳은가?

건배.

+2

을 = 새로운 derivedClass (1)'dcObjPtr 말을하기 위해 : 당신이 필요가있는 무엇과 같이, baseClass 외부와 derivedClass 후 생성자 정의를 이동하다 그 시점에. 당신이 무한한 재귀를 얻을 것이라고 "고칠"경우. – juanchopanza

답변

1

baseClass 생성자에서 new derivedClass을 호출하여 정의되기 전에 derivedClass의 정의를 사용하고 있습니다. 당신은하지 않는`당신이 필요로하는 클래스 정의,

#include<iostream> 
using namespace std; 

class derivedClass; 
class baseClass 
{ 
public: 
    int objID; 
    derivedClass* dcObjPtr; 

    baseClass() 
    { 
     cout << "(1) Default constructor" << objID << endl; 
    } 

    baseClass(int ID); 

}; 

class derivedClass : public baseClass 
{ 
public: 
    derivedClass() 
    {} 

    derivedClass(int ID) : baseClass(ID) 
    { 
     cout << "(4) Constructing derived object with ID: " << objID << endl; 
    } 
}; 

baseClass::baseClass(int ID) 
{ 
    objID = ID; 
    dcObjPtr = new derivedClass(1); 
    cout << "(2) Constructing base object with ID: " << objID << endl; 
} 

int main(int argc, char** argv) 
{ 
    derivedClass dcObj(1); 

    return 0; 
}  
+1

이 [ideone] (http://ideone.com/hOzQKD)을 실행하면 컴파일되지만 런타임 오류가 발생합니다. 나는 그것이 무엇인지 조사하지 않았다. – Chowlett

+1

그것은 무한 재귀가 될 것입니다 ... – juanchopanza

+0

아, 물론 이죠. 그것은 juanchopanza 무한 재귀 언급. – Chowlett

관련 문제