2014-11-18 1 views
1

내 C++ 컴파일러에서 다음을 시도 할 때 "Foo 클래스에 대한 기본 생성자가 없습니다"라는 오류 메시지가 표시됩니다.C++에서 참조로 객체를 전달하기 위해 기본 생성자가 필요한 이유는 무엇입니까?

MyClass에 :: MyClass에 (const를 푸 & foo는) { ... } 내가 참조를 전달하고있어 경우

, 개체가 이미 초기화해야 맞습니까? 그리고 명시 적으로 정의했기 때문에 복사 생성자에는 문제가 없습니다. 그렇다면 왜 참조를 전달하기 위해 기본 생성자가 필요합니까?

내가 생각할 수 있었던 유일한 점은 메모리에 할당 할 메모리 양을 알지 못할 수도 있다는 것입니다. 이것이 문제라면 컴파일러에게이 객체를 동적으로 할당하려는 의도가 있음을 알리는 방법이 있습니까? 온라인으로 답변을 찾을 수 없었기 때문에 도움을 주시면 감사하겠습니다.

편집 : 실제 코드를 편집하려고합니다.

MemberManager.cpp :

#include "MemberManager.h" 

MemberManager::MemberManager(const NodeManager& nodeSet, std::vector<int> cctMat, int n) 
{ 
    for(int i = 0; i < n; i++) 
    { 
     memSet[i] = Member(); 
    } 
} 

NodeManager.h

#include "Node.h" 

class NodeManager 
{ 
public: 
    //constructors 
    NodeManager(std::vector<double> crdMat, std::vector<Constraint> cstMat, int n): 
     nodeSet(n) {}; 
    //copy 
    NodeManager(const NodeManager& src): 
     nodeSet(src.nodeSet) {}; 
} 

내 정확한 오류 메시지가 MemberManager :: MemberManager (...) 그것의 첫 번째 바디 브래킷 아래에 빨간색 밑줄입니다 NodeManager에 대한 기본 생성자가 없다고 말합니다. 이것은 내 의도이지만 기본 생성자가 필요한 이유는 모르겠습니다.

+0

어떤 언어입니까? –

+0

내가했던 것처럼 [tag : C++] 태그도 추가해야합니다. –

+0

'Foo'를 입력으로받는 MyClass에 대한 생성자를 보여줍니다. 'Foo'는 어떤 종류의 생성자를 가지고 있습니까? 오류가 발생하면 그 'MyClass' 생성자에 대한 호출은 어떻게 생겼을까요? 컴파일러는'Foo'를 생성 할 수없는 것을 전달하고 있다고 당신에게 말하려고합니다. –

답변

4

참조로 개체를 전달하는 데 기본 생성자가 필요하지 않습니다. 당신의 코드는 그러한 것을 요구하는 다른 것을해야만합니다.

내 생각 엔 MyClass에는 Foo 회원이 있습니다. 이 기본-작도되지 않은 경우,이 선언에 초기화 할 필요가, 또는 생성자의 initialiser 목록 :

MyClass::MyClass(const Foo& foo) : foo(foo) { ... } 
            ^^^^^^^^ 
            initialiser list 

이 회원이 foo라고 가정합니다,에 의해 initalised해야하는데 있음 함수 매개 변수를 복사합니다.

+0

내가 할 수 있으면 나는 너를 업 그레 이드하겠다. 이것은 실제로 문제 였지만 오류가 표시되는 곳에서는 혼란 스러웠습니다. 고마워요! – ewpcasey

0

어떤 컴파일러를 사용하는지, 어떤 표준을 준수하는지, MyClass에 대한 다른 생성자가 있는지 알고 있으면 도움이됩니다.

다른 생성자를 정의했기 때문에 컴파일러에서 기본 생성자 MyClass()을 생성하지 않는다고 상상할 수 있습니다. 컴파일러는 이제까지

class MyClass mc; 

유일한 방법은 의 부재에서 이러한 목표를 달성하기에 같은 class MyClass의 기본 객체를 생성 할해야 할 것은이 class Foo이 필요

class MyClass mc(Foo()); 

으로 코드 선 위에 생각하는 것입니다 기본 생성자가 있어야합니다.

나는 이것을 코멘트로 만들었지 만 아직 허용되지는 않았다.

+0

저는 Visual Studio express 2013 with C++ 11을 사용하고 있습니다. MyClass 생성자를 호출하면 오류가 발생하지 않습니다.이 클래스는 본문의 첫 번째 괄호에 밑줄을 긋습니다. 나는 아직 아무것도 부르지 않았다. MyClass : MyClass (const Foo & foo)는 지금까지 유일한 생성자이며 클래스의 유일한 메소드입니다. – ewpcasey

+0

위의 논문이 맞는지 확인하려면 MyClass에 기본 생성자를 추가 할 수 있습니까? 클래스에 이해가되지 않더라도 기본 생성자를 사용하고 필요한 생성자를 찾을 수있는 경우가 많습니다. – ua2b

관련 문제