참조별로 초기 시간을 던지는 것
-
20-09-2019 - |
문제
스택에 스택에 구성된 물체를 트리 블록으로 비정규 참조로 던지고 잡아서 수정 한 다음 다른 캐치 블록을 참조하여 던지는 데 문제가 있습니까?
아래는 내가 언급 한 내용의 짧은 예입니다.
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()
. 그렇게하면 컴파일러 또는 표시되지 않는 코드에 문제가 있어야합니다.