문제

스택에 스택에 구성된 물체를 트리 블록으로 비정규 참조로 던지고 잡아서 수정 한 다음 다른 캐치 블록을 참조하여 던지는 데 문제가 있습니까?

아래는 내가 언급 한 내용의 짧은 예입니다.

struct EC {
    EC(string msg) { what = msg; }
    string where;
    string what;

    void app(string& t) { where += t; }
    string get() { return what; }
};

try {
    try {
        try {
            EC error("Test");
            throw error;
        }
        catch (EC& e) {
            e.app("1");
            throw e;
        }
    }
    catch (EC& e) {
        e.app("2");
        throw e;
    }
}
catch (EC& e) {
     e.app("3");
     cout << e.where << endl;
     cout << e.get() << endl;
}

이것이 E.가 쓰레기를 포함 할 수있는 것을 유발할 수 있지만 E.는 그대로 유지할 수있는 곳이 있습니까? 예를 들어:
E. 어디서 "123"
e.get ()는 널 바이트에 부딪 칠 때까지 많은 쓰레기 데이터를 반환합니다.

도움이 되었습니까?

해결책

"참조로 던지기"와 같은 것은 없습니다. 단순히 불가능합니다. 그것에 대한 구문은 없습니다. "참조"를 던질 때마다 참조 된 객체의 사본이 실제로 던져집니다. 말할 것도없이, 코드에서 참조로 던지려는 시도는 없습니다.

가능하다 잡다 이전에 예외를 참조하여 예외 (초보자가 아닌 것조차도)를 통해 임시 예외 객체를 수정합니다. 작동합니다. 실제로, 당신은 현재 수정 된 것을 다시 던질 수 있습니다 기존의 a를 만드는 대신 예외 객체 새로운 하나. 즉, 당신은 그냥 할 수 있습니다

throw;

대신에

throw e;

당신의 캐치 조항에서 여전히 올바르게 행동하는 코드를 얻습니다. 즉, 원래 객체 (수정 포함)는 핸들러 계층 구조를 계속합니다.

그러나 귀하의 코드는 그대로 잘못 구성됩니다

e.app("1"); 

전화 (및 기타 전화로 app) 매개 변수는 정점이 아닌 참조이므로. 변경 app 어느 쪽이든 선언

void app(const string& t) { where += t; }  // <- either this
void app(string t) { where += t; }         // <- or this

컴파일하기 위해.

그렇지 않으면 코드가 정상적으로 작동해야합니다. 당신은 쓰레기를 얻지 않아야합니다 get(). 그렇게하면 컴파일러 또는 표시되지 않는 코드에 문제가 있어야합니다.

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