2013-06-19 1 views
1

다음 할당이 작동하지 않는 이유는 무엇입니까? 가능하다면 저급의 설명을 원합니다. 호환되지 않는 유형 '문자 [20]'당신이 배열의 UCSDStudent(char name[])에만 ADRESS 같은 함수 호출이있을 때배열 변수를 '='연산자와 함께 다른 배열 변수에 직접 할당 할 수없는 이유는 무엇입니까?

name
class UCSDStudent { 

    char name[20]; 

    public: 

    UCSDStudent(char name[]) { 
     //this-> name = name; does not work! Please explain why not 
     strcopy(this -> copy, copy); //works 
    } 

}; 
+0

C는 Java와 같이 모두 좋아하지 않으므로 (C++이 im를 상속해야한다는 수치). C++는 주로 C 대신 C++ 기능을 사용하는 경우입니다. – chris

+0

C 및 포인터 때문입니다. –

+1

글쎄, 나는 거짓말하지 않을거야. 나는 그만큼 내 자신을 추론했다. –

답변

2

때문에에 '숯불 *'의 과제에 : 또한, 여기에 내가 얻을 컴파일러 오류입니다 전체 배열 대신 복사됩니다. 이것은 C \ C++ 기능입니다.

namechar name [20]으로 정의되며 수정 가능 값은 아닙니다.

에 대해서는: 소스 배열에 NULL 문자가없는 것처럼 정의되지 않은 상태가 발생하므로 쓰레기를 this->name으로 복사합니다. strcpyhere

+0

참조로 배열을 전달했다하더라도 여전히 작동하지 않습니다. – chris

+0

@chris 나는 오타가 있었는데, 그것은 lvalue가 아닙니다. –

+0

그 부분을 제거했습니다. – chris

0

여전히 배열을 배열에 할당하려면 루프를 사용하십시오. 예를 들어 대한

: 클래스 UCSDStudent {

char name[20]; 

public: 

UCSDStudent(char name[]) 
{ 

for(int i = 0; i<20; i++) 
    { 
    this-> name[i] = name[i]; 

    } 
} 
}; 
+0

'name' 매개 변수의 문자 수가 20 자 미만이면 어떻게됩니까? – fredoverflow

+0

올바른 들여 쓰기를 사용하십시오. – sp2danny

1

그냥 그런 식으로 복사 할 수 있도록 배열로 이름을 assingned과 이름이 21 카운트가 있기 때문에. with 루프를 복사하려면 "="을 사용해야하며 배열의 수를 알아야합니다. 당신이 사본 하나를 원하는 경우

for(int i = 0; i<20; i++){ 

    this -> name[i]=name[i]; 
    } 
0

C 스타일 배열, 그런 식으로 복사 가능한되지 않으며, 대신 콘텐츠를 복사 할 수 있습니다

int arr1[10] = {1,2,3,4,5,6,7,8,9,10}; 
int arr2[10]; 
std::copy(arr1, arr1+10, arr2); 
// std::copy() lives in <algorithm> 
// content of arr2 is a now copy of arr1 

을하지만, C 스타일과 같은 낮은 수준의 기능을 배열은 피하는 것이 가장 좋습니다.

가변 길이 문자열이 실제로 필요한 경우 std::string 을 사용하고 할당 연산자를 통해 복사를 지원합니다.

고정 길이 배열을 원하면 대신 할당 연산자를 통해 복사를 지원하는 std::array<T,N>을 사용하십시오. 당신이 세터와 게터를 가진 계획하는 경우

#include <string> 

class UCSDStudent 
{ 
    std::string name; 
public: 
    UCSDStudent(std::string name) 
     : name(name) 
    { 
    } 
    void SetName(std::string new_name) 
    { 
     name = new_name; 
    } 
}; 

이 또한주의 :

또한 추천은 매개 변수 이름과 멤버 변수 이름은 멤버 초기화 구문을 사용하여 생성자를 제외하고, 별개이다,주의 모든 구성원 변수를 사용하는 경우 최소한 클래스에 class-invariant이없는 경우 공개 데이터를 대신 사용해 볼 수 있습니다.

0

이 예를 들어 보겠습니다.

int arr1[10] = {1,2,3,4,5,6,7,8,9,10}; 

는 C++의 경우, 배열 이름 arr1 별도의 메모리 위치를 얻을 수 없다. arr1의 일종의 메모리 위치가 arr1[0]이지만 더 단순화 된 것이 사실입니다. 배열이 C++에서 참조되는 방식은 기호 테이블을 통해 이루어집니다.배열이 생성 될 때 실제로 발생하는 것은 arr1에 해당하며 컴파일 타임에 엔트리가 심볼 테이블에 생성되며이 항목에는 데이터 유형 arr1 (여기에는 정수 유형 배열)을 나타내는 정보가 포함되어 있습니다. 주소는 arr1[0]입니다. 자 여기 재미있는 것이 있습니다. 엔트리가 심볼 테이블에 생성되면, C++은 엔트리가 변경되는 것을 허용하지 않습니다.

arr1=arr2을 수행하는 경우 기본적으로 수행하려는 작업은 arr1을 심볼 테이블의 arr2에 해당하는 항목에 다시 지정해야합니다. 그러나 arr1에는 이미 기호 테이블에 값이 할당되어 있습니다. 그래서 C++은 에러를 줄 것입니다.

관련 문제