2010-06-03 4 views
0

를 호출하고 있습니다 :생성자 코드에서 두 번

//file main.cpp 
LINT a = "12"; 
LINT b = 3; 
a = "3";//WHY THIS LINE INVOKES CTOR? 


std::string t = "1"; 
//LINT a = t;//Err NO SUITABLE CONV FROM STRING TO LINT. Shouldn't ctor do it? 

//file LINT.h 
#pragma once 
#include "LINT_rep.h" 
class LINT 
{ 
private: 
    typedef LINT_rep value_type; 
    const value_type* my_data_; 
    template<class T> 
    void init_(const T&); 
public: 
    LINT(const char* = 0); 
    LINT(const std::string&); 
    LINT(const LINT&); 
    LINT(const long_long&); 
    LINT& operator=(const LINT&); 
    virtual ~LINT(void); 

    LINT operator+()const;    //DONE 
    LINT operator+(const LINT&)const;//DONE 
    LINT operator-()const;    //DONE 
    LINT operator-(const LINT&)const;//DONE 
    LINT operator*(const LINT&)const;//DONE 
    LINT operator/(const LINT&)const;///WAITS FOR APPROVAL 

    LINT& operator+=(const LINT&);//DONE 
    LINT& operator-=(const LINT&);//DONE 
    LINT& operator*=(const LINT&);//DONE 
    LINT operator/=(const LINT&);///WAITS FOR APPROVAL 
}; 

호출 3 호선 대신 할당 optor의 ctor에에. 왜? 나는 일부 서버에서 전체 솔루션을 uppload하려고합니다. 그렇지 않으면 여기에 모든 것을 넣기가 어렵습니다. 나는 또한 비디오 파일을 업로드 할 수 있습니다. 또 다른 한가지는이 할당 자 optor를 구현할 때이 optor가 이미 obj 파일에 있다는 오류가 발생하고 있다는 것입니다. 무슨 일이야?

+0

"="연산자의 구현을 게시 할 수 있습니까? – Simon

+0

'LINT' 란 무엇입니까? 왜'#pragma once'와'#include '전에 LINT a = "12"? 어떤 함수에서든지 변수를 바꿀 수는 없습니다. –

+0

@Alexey Malistov 죄송합니다.이 코드는 두 가지 다른 파일에서 언급해야합니다. 그것을 고칠 예정이다. –

답변

7

'3'당신을 사용하여 LINT에 구축 한 다음 할당되고있다 : 당신은 아마 같은 뭔가가 필요 = 연산자.

편집 : 코드에서 2 번째 질문에 관해서는, 당신은 문자열의 char* 버퍼를 얻기 위해 std::stringc_str()를 호출 할 필요가 다음 같은 일이 당신의 문자 3.

4

다음 생성자 :

LINT (const char * = 0);

은 리터럴 지정 "3"에 대해 암시 적 생성자 호출로 작동하기 때문에 호출됩니다. 이를 방지하려면 생성자 앞에 '명시 적'한정자를 접두사로 붙입니다.

암시 적 구성없이 할당하려는 유형에 대한 대입 연산자도 추가하십시오.

+0

+1은 '명시 적'이라고 언급합니다. –

2

사용할 수있는 할당 연산자가 지정되어 있지 않기 때문에. 당신은 문자 그대로, std::string (또는 char*)의 우를 취하는 = 연산자를, 그래서없는 LINT& operator=(const char*);

+0

@ 알고 계신다. 틀렸어. 컴파일러는 복사 할당 연산자 (즉, RHS가 클래스 자체와 동일한 유형 (modulo const &) 인 것) 만 생성합니다. 변환 할당 연산자는 컴파일러에서 생성되지 않습니다. –

+0

@ 알고있는 나를 알았습니다. 할당 연산자 ... – jpalecek

+0

@Drew Hall I 좌석이 수정되었습니다. 당신이 틀렸어요. 변환이 적용되고 있다는 것을 고려하지 않았습니다. –

6

과제처럼 일어날 것 연산자는 매개 변수로 LINT 객체를 필요하지만 당신이 말할 때 : 당신은, 문자 할당 연산에게 LINT 객체를 문자열을하지 나눠주고있다

a = "3"; 

. 컴파일러는 할당 op가 사용할 수있는 LINT 객체를 생성해야하므로 const char *을 매개 변수로 사용하는 생성자를 호출합니다.

+0

@Neil 제 질문에 대한 귀하의 대답은 우리는 지금부터 멋지다. 아니면 그냥 실수를해서 whos가 뭔지 알지 못하니? –

1

있습니다. LINT& operator=(const LINT&); 해당 사항 없음 LINT& operator=(const char *); 그러나 많은 암시 적 ctors가 있습니다. 따라서 implict ctor가 호출됩니다.

+0

문자열을 LINT로 변환 할 수없는 이유는 무엇입니까? –

+0

그리고 구현하려고 할 때 오류가 발생하는 이유는 무엇입니까? operator =()? –

+0

@All 나는 쉬기로 결심했다. 나는 새로운 솔루션을 만들었고, 그 파일들 (* .h & * .cpp)과 surpr ise는 문자열을 LINT로 변환 할 수 없으며 operator =() 연산자로 더 이상 문제를 일으키지 않습니다. –

0

LINT 클래스가 정의하는 유일한 할당 연산자는 복사 할당 연산자 LINT& operator=(const LINT&)입니다. 따라서 3 행에서 정적 C 스타일 문자열 (const char [])을 LINT 객체에 할당하려고하면 컴파일러에서 일치하는 할당 연산자가 없음을 인식합니다.

그러나 컴파일러는 사용자 정의 형식 변환을 사용하여 호출을 수행 할 수 있습니다. LINT (const char *) 생성자를 선택하여 const char []를 LINT 객체로 변환 한 다음 오른쪽에 생성 한 임시 LINT 객체에서 복사 할당 연산자를 호출합니다.

LINT& operator=(const char*) 할당 연산자를 사용하여 복사 할당 연산자를 보완하면 임시로이 문제를 피할 수 있습니다.

2

생성자 char* (예컨대 LINT a = "3")에 대한 할당 변환 생성자 같은

LINT(const char* = 0); 

작용한다. =() -operator는 LINT 개체를 다른 LINT 개체에 할당 한 경우에만 호출됩니다.

LINT a; 
LINT& b = a 
LINT& c = LINT("4"); 

식은 위의 =() - 연산자를 호출합니다.