2016-11-03 4 views
0

나는 C의 기본 생성자 ++ 관련 질문이 있습니다. 정적 배열

class Name 
{ 
    public: 
     Name(string name); 
    private: 
     m_name; 
} 

class DataBase 
{ 
public: 
     DataBase(); 
     void addToDB(string name); 
     Name* getPtrToName(string name); 
private: 
     Name m_Name[10]; 
     int NoOfEntries; 
} 

가 지금은 클래스 데이터베이스의 객체를 생성하고 데이터베이스에 새 항목을 추가하는 것을 시도하고있다 : 다음

클래스와 코드입니다.
/* 
* Name.cpp 
*/ 
Name::Name(string name) //overloaded constructor 
{ 
    m_name = name; 
} 


/* 
* DataBase.cpp 
*/ 
DataBase::addToDB(string name) // add entries to the database 
{ 
    Name newEntryToDB(name); 
    m_Name[NoOfEntries] = newEntryToDB; 
    NoOfEntries++; 
} 

DataBase::DataBase() // gives an error stating no matching call for function Name::Name() 
{ 
    NoOfEntries = 0; 
} 

오류 "함수 이름에 대한 일치 전화 : 이름()"이제 내가 단순히 Name.cpp의 기본 생성자를 정의하고 컴파일을 확인할 수 있는지 이해

오류. 그러나 컴파일러에서 자동으로 호출되는 기본 생성자가 아닙니까? 이렇게하면 오류가 트리거되는 것을 피할 수 있습니다.

떨어져 Name.cpp의 기본 생성자를 정의에서이 오류를 해결하려면 다른 방법이 있습니까?

+0

글쎄, 당신의 배열은 ** 항상 ** ** 정확히 ** 10 개 요소가 포함되어 있습니다. 배열을 처음부터 어떻게 초기화하고 싶습니까? 당신이 (데이터베이스 개체의 수명의 시작 부분에서 빈 즉)는 동적으로 크기로하려면, 대신에'표준 : vector'를 사용합니다. - 또는 - Name을 "dummy"또는 "null"값으로 초기화 할 기본 생성자를 실제로 정의하십시오. 배열의'NoOfEntries' 엔트리에 대해서만 접근한다면,이 더미 값이 얼마나 정확하게 정의되는지는 중요하지 않습니다. – leemes

+0

@leemes - 정확히 !! 'NoOfEntries'는 Database의 값을 제한하는 데 사용됩니다. 나는 코드를 단순화하기 위해 여기에 추가하는 것을 피했다. :) – user2559758

답변

2

그러나이 컴파일러에 의해 자동으로 호출 기본 생성자 아닌가요?

아니 그렇지 않습니다. 직접 생성자를 제공하면 컴파일러는 더 이상 기본 생성자를 제공하지 않습니다. 당신은 일을해야 할 것 중 하나 아니면 그냥 기본 생성자를 선언하는 헤더 파일에 클래스 선언에서

Name() = default; 

를 사용할 수 있습니다.

std::vector을 사용하면 "배열"을 가질 수 있지만 한 번에 하나의 개체를 추가 할 수 있습니다.