문제

생성자가 문자열에 대한 const 참조를 사용하는 클래스가 있습니다.이 문자열은 객체의 이름 역할을 하므로 클래스 인스턴스의 수명 전체에 걸쳐 필요합니다.

이제 이 클래스를 어떻게 사용할 수 있는지 상상해 보세요.

class myclass {
public:
    myclass(const std::string& _name) : name(_name) {}
private:
    std::string name;
};

myclass* proc() {
    std::string str("hello");
    myclass* instance = new myclass(str);
    //...
    return instance;
}

int main() {
    myclass* inst = proc();
    //...
    delete inst;
    return 0;
}

Proc ()의 문자열이 스택에서 생성되므로 Proc ()가 완료되면 삭제되므로 클래스 인스턴스 내부의 참조는 어떻게됩니까?내 생각엔 무효가 되는 것 같다.수업 중에 사본을 보관하는 것이 더 나을까요?문자열과 같이 잠재적으로 큰 개체를 불필요하게 복사하는 것을 피하고 싶습니다.

도움이 되었습니까?

해결책

예, 귀하의 경우 참조가 유효하지 않습니다. 문자열을 사용하고 있으므로 문자열 객체의 사본을 myclass 수업.

다른 팁

반드시:복사.클래스에 "std::string name" 멤버가 있어야 합니다.이것이 수명을 제어할 수 있는 유일한 방법입니다.

MyClass :: _ 이름이 참조가 아닌 경우 복사되어 유효하지 않습니다.

복사 할 필요가 없습니다. 선언하다 std::string name (참조 아님) 회원 myclass (어떻게 든 완전히 생략). 그리고 패스 const char * 논쟁으로. 이렇게하면 복사없이 클래스에서 이름 객체를 바로 구성합니다.

class myclass {
public:
    std::string name;
    myclass(const char *_name) : name(_name) { }
};

myclass *proc() {
    return new myclass("hello");
}

예, std :: 문자열이 사라지지만 C str "hello"는 상수가 아니기 때문에 그렇지 않습니다.

두 가지 가능한 답변이 있습니다. C str을 참조로 사용하거나 std : staic을 staic으로 만드십시오.

필드 myclass :: 이름은 std :: string 유형이어야합니다. C ++의 문자열은 복사됩니다 (http://en.wikipedia.org/wiki/copy-on-write) 따라서 큰 물체를 복사하는 데 문제가 없습니다.

문자열의 사본을 MyClass에 보관하고 참조를 유지하는 것은 확실히 있습니다. ~ 아니다 안전한. 많은 인스턴스가 같은 이름을 가질 것으로 예상되면 플라이급 디자인 패턴 동일한 인스턴스가 많을 때 저장소를 저장할 수 있습니다. boost.flyweight 이 패턴의 매우 도발적인 구현으로 간단히 쓸 수 있습니다.

class myclass {
public:
    myclass(const std::string& _name) : name(_name) {}
private:
    boost::flyweight<std::string> name;
};

STD :: 문자열의 일부 구현은 현장 뒤에서이 작업을 수행 할 수 있지만 필요하지 않습니다. 당신은 이것에 의존하지 않아야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top