2012-03-05 5 views
0

이것은 초보자 질문 일 수 있지만이 문제를 해결할 수 없습니다. 전 또는 후자의 문제를 개별적으로 해결할 수는 있지만 동시에 해결할 수는 없습니다.함수에 문자열 리터럴 전달 및 멤버 변수에 할당

문자열 멤버가있는 클래스와이를 설정하는 함수가 있습니다. 함수에 리터럴을 전달하려고합니다.

class Profiler 
{ 
private: 
    std::string description; 
    //snip 

public: 
    //snip 
    void startJob(const std::string &desc); 
}; 

void Profiler::startJob(const string &desc) { 
    //snip 
    description = desc; 
} 

내가 (사실)가 필요합니다은 다음과 같이 사용합니다 :

profiler.startJob("2 preprocess: 1 cvConvertScale"); 

문제점은 다음과 같습니다

  • 어떻게 리터럴 문자열을 전달하는 함수로? 찾을 수있는 답변 : 값으로 전달하거나 const 포인터 또는 const 참조로 전달하십시오. 속도가 느리기 때문에 값으로 전달하고 싶지 않습니다. (결국 프로파일 러이며, 마이크로 초까지 정확합니다.) Const 포인터/참조가 컴파일러 오류를 내고 있습니까? (또는 내가 잘못하고있는 것이 있습니까?)

  • 어떻게 멤버 함수에 할당합니까? 내가 찾을 수있는 유일한 해결책은 멤버 변수를 포인터로 만드는 것입니다. 비 - 포인터로 만들면 "필드 '설명에'불완전한 유형이 있습니다. '라는 오류가 표시됩니다 (이 의미는?). 그것을 const가 아닌 const에 할당하기 때문에 포인터로 사용하는 것은 효과가 없습니다. const 포인터/참조 만 작동하는 것 같습니다.

    #include <string> 
    
    class Profiler 
    { 
        private: 
        std::string description; 
        //snip 
    
    public: 
        //snip 
        void startJob(const std::string &desc); 
    }; 
    
    void Profiler::startJob(const string &desc) { 
        //snip 
        description = desc; 
    } 
    

    값으로 저장하는 오케이이다

+0

두 가지 : 1. 참조를 위해 실제 변수가 필요합니다. 따라서'string arg = "2 전처리 : 1 cvConvertScale"; profiler.startJob (arg);'2. 포인터를 올바르게 지정하지 않았습니다. 'description = &desc; ' – chris

답변

1

참조로 패스 값만큼 저장은 헤더를 포함 원본 문자열을 수정하지 않는 한 그렇게하지 않으면 메모리를 공유하고 비효율적 인 복사본이 생성되지 않습니다.이 경우 std :: string으로 제어되는 버퍼에 복사 된 문자를 얻게됩니다.

o.k이지만 std :: string의 인스턴스로 literal-char *에 대한 포인터를 저장할 수 없다고 생각합니다. char * 포인터를 저장한다.

+0

'std :: string description;'을 사용하면 앞서 언급 한'field '설명에'incomplete type을 가지고있다 '라는 에러가 나온다. 그리고 나는 그들이 메모리를 공유하기를 원한다. 문자열은 문자 적이며 결코 바뀌지 않는다. –

+0

나는'char *'에 의해 전달하고 저장했지만, MSVC에서만 작동했다. MinGW에서 const char *를 char *로 변환하려고하는데 오류가 발생한다. (MSVC가이 오류를주지 않는 이유는 미스테리이다. 나를) –

관련 문제