2010-02-02 11 views
2

이 클래스는 정의 된 있습니다 :로컬 변수에 같은 이름이 있으면 C++에서 인스턴스 변수에 어떻게 할당 할 수 있습니까?

class MyClass 
{ 
    int x; 
    public: 
     MyClass(int x); 
}; 

MyClass::MyClass(int x) 
{ //Assign x here 
} 

그러나 인스턴스 변수와 같은 이름을 가진 생성자에서 x 초기화 할 수 없습니다. 인수의 이름을 변경하는 것 이외의 다른 방법이 있습니까?

+2

오류가 발생했습니다. 컴파일러는 정당하게 불평합니다. 코드를 수정하십시오. – dirkgently

+1

음 ... 매개 변수의 이름을 바꾸시겠습니까? –

답변

12

최선의 선택은 생성자의 초기화 목록을 사용하는 것입니다

MyClass::MyClass(int x) : x(x) { // Body } 

을하지만 당신은 또한이 방법을 시도 할 수 :

MyClass::MyClass(int x) { this->x = x; } 
+1

"올바른"방법을 설명하는 데 대해 감사드립니다! – Mike

+0

@dirkgently GCC 4.2는이 문제에 대해 불평하지 않습니다 ... 섀도 잉이 나쁜 이유는 무엇입니까? – Mike

+2

@dirkgently - 섀도 잉은 이상적이지는 않지만 유효한 C++입니다. 우리는 하루 종일 섀도 잉에 대해 토론 할 수 있었지만 그가 알고 싶었던 것은 C++ 의미론이었습니다. – Naaff

0

this->x을 대신 사용하십시오.

+0

이것은 포인터입니다. –

+0

'this'는 C++의 포인터입니다. –

+0

이것은 포인터입니다. this-> x가 아니라 this.x;)를 사용하십시오. – AntonioMO

2

this->x = x;

+0

진지하게. 더 나은 이름을 사용하도록 조언 할 수는 없습니다. 그리고 int가 아닌 더 복잡한 유형의 경우에는 잘못된 대답입니다. –

+0

예, 맞습니다. 더 나은 이름, 추가 초기화, 등등. 이것을 지적 해 주셔서 감사합니다. –

2

명시 적으로 참조 할 this을 사용할 수 있습니다 현재 개체 :

(210)
+0

진지하게. 더 나은 이름을 사용하도록 조언 할 수는 없습니다. 그리고 int가 아닌 더 복잡한 유형의 경우에는 잘못된 대답입니다. –

+0

어떻게 더 높은 직위를 가진 사람들은 laconically 'this-> x = x;'라고 제안하는 반면, 더 낮은 직무를 가진 사람들은 매개 변수의 이름을 바꾸라고 제안하고 있습니까? 뛰어난 기술 지식과 상식? :) – UncleBens

0

는이 포인터 물론

MyClass::MyClass(int x) 
{ 
    this->x = x; 
} 

더 나은 해결책이 될 것이다 처음에 같은 이름이 충돌 가지고 있지를 사용합니다.

+0

나는 이것이 양쪽 세계의 가장 나쁜 것을 결합 시킨다고 생각한다. 'this-> x = x'는 불량한 형태 일 필요는 없습니다. 또한 * Scott Meyers *가 그의 ** Effective C++ ** 시리즈에서 "생성자의 초기화 목록 선호." –

0

this-> x = x이 (가) 작동하지 않습니까? 이것이 우리가 한 것입니다 (또는 다른 매개 변수 이름을 사용했습니다).

3

제발 - 실제로 충돌하지 않는 멤버 변수에 대한 명명 규칙이 있어야합니다. 이것은 일반적으로 C++ 하우스에 대한 코딩 규칙 1 또는 2입니다. 당신이 m_foo = 줄을 볼 때 다음 당신은 정확히

에 무슨 일이 일어나고 있는지 우리는 나는 또한 당신이 알고 있다면 사전에

int _thingy; 
int thingy_ 

사과를 보았고 수 없거나을드립니다

int m_thingy; 

을 사용하여 알고 그렇지 않다.

+4

"_"로 시작하는 식별자를 사용하지 않는 것이 좋습니다. – Bill

+1

Ditto to Bill : http://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in-a-c-identifier/228797#228797 –

8

그러나 인스턴스 변수와 이름이 같으므로 생성자에서 x를 초기화 할 수 없습니다. 인수의 이름을 변경하는 것 이외의 다른 방법이 있습니까?

매개 변수 이름을 변경하십시오! 당신은 단지 코드를 읽기가 어렵게되는 지역으로 매개 변수 이름을 동일 makeing으로

class MyClass 
{ 
    int x; 
    public: 
     MyClass(int xInitVal); 
}; 

MyClass::MyClass(int xInitVal) 
    :x(xInitVal) 
{ // Don't assign x here. 
} 

. 하지 마십시오. 거의 모든 스타일 가이드는 매개 변수를 멤버와 같은 이름으로 만들지 말라고 알려줍니다. 상식의 작은 비트 바랍니다.

this->x = x; 

일자리를 부탁하지 마십시오 대답 모든 사람들에게

< 호언 장담 > .맙소사, 너는 고의적으로 문제를 일으키려고하고있다.
끔찍한 사실은 이것이 나쁜 생각이라는 것을 알려주는 것이 아닙니다.

예 기술적으로 허용되지만 코드 전체를 읽기 쉽도록 유지하고 이전 작성자의 의도를 디코딩하는 이국적인 기술로 만들지 않는 것이 중요합니다.

</호언 장담 >

1

난 강력하게 그냥 변수 이름을 변경하는 것이 좋습니다. 중복 된 식별자를 사용하는 것은 원인이없는 싸움입니다.

내 코드에서 모든 함수 매개 변수에 접두사 'in'("inValue")을 지정합니다. 모든 개인 멤버 변수에 접두사 'm'("mValue")을 지정합니다.

관련 문제