2017-09-27 3 views
0

이 질문에 대한 몇 가지 다른 질문을 살펴 보았습니다.하지만 내 사례는 훨씬 간단 해 보였습니다. .Visual C++ : 기본 생성자가 없습니다.

Learn.h :

#ifndef LEARN_H 
#define LEARN_H 

class Learn 
{ 
public: 
    Learn(int x); 
    ~Learn(); 

private: 
    const int favourite; 
}; 

#endif 

Learn.cpp :

#include "Learn.h" 
#include <iostream> 
using namespace std; 

Learn::Learn(int x=0): favourite(x) 
{ 
    cout << "Constructor" << endl; 
} 

Learn::~Learn() 
{ 
    cout << "Destructor" << endl; 
} 

Source.cpp :

#include <iostream> 
#include "Learn.h" 
using namespace std; 

int main() { 
    cout << "What's your favourite integer? "; 
    int x; cin >> x; 
    Learn(0); 

    system("PAUSE"); 
} 

자체에 위의 코드를 출력하지 않는 오류.

그러나 Learn(0)Learn(x)으로 바꾼 후에 몇 가지 오류가 발생합니다. 그들은 :

  • 오류 E0291 : no default constructor exists for class Learn
  • Error C2371 : 'x' : redefinition; different basic types
  • Error C2512 : 이것에 대한 'Learn' : no appropriate default constructor available

이유라도? 실제로 실제로 0 대신 정수형 변수 x을 입력하려고합니다. 나는 이것이 단지 연습이고 나는 이것에 대해 새로운 것을 알지만, 정말로 이것이 왜 효과가 없는지에 대해서는 약간 혼란 스럽다.

감사합니다. 감사드립니다.

+1

.cpp에서 학습 ctor의 기본값 x를 지정하려고했습니다. 대신 헤더에 정의해야합니다. – ZeroUltimax

+0

@ZeroUltimax는 기본 매개 변수에 대해서는 정확하지만 컴파일러가 불평하는 진정한 이유는 'Learn'이라는 함수를 정의하려고한다고 생각하기 때문입니다. 시도하는 것처럼 생성자를 호출 할 수 없습니다. 'Learn some_name (x); '을 사용해야합니다. – Jonesinator

+0

[OT] :'Learn :: Learn (int x = 0)'는 cpp에서 쓸모가 없습니다. 기본값은 그 cpp 파일에서만 사용 가능합니다. 그것을 제거하거나 머리글에 넣으십시오. – Jarod42

답변

5

구문 분석 문제 : 당신은 임시을 구축

Learn{x}; 

를 사용해야합니다

Learn x; 

Learn(x); 

는 구문 분석됩니다.

+1

더 잘 알려라 :'Learn tmp {x};' – rustyx

+2

@RustyX : 더 이상 일시적인 것이 아니며, 일시 중지 후 "Destructor"의 인쇄물이 나옵니다.가능하다면 여분의 범위'{Learn tmp {x};}를 사용하면됩니다. – Jarod42

+0

@ Jarod42 임시 란 무엇입니까? 죄송합니다, C++에 조금 익숙합니다. 또한 대괄호 안에있는 변경이 왜 여기에 영향을 미쳤는지에 대해 혼란스러워합니다. –

0

좋아요, 문제가 있다고 생각했습니다. 호출이 객체 할당의 일부로 수행되었다는 사실을 알지 못했습니다. C++의 표기법은 약간 다른 것처럼 보입니다.

따라서 Learn(x)Learn obj(x)으로 바꿔야합니다.

이 표기법은 일반적으로 className(inputs) variableName을 작성할 수있는 다른 프로그래밍 언어에서 약간 벗어났습니다.

관련 문제