C ++에 대한 까다로운 인터뷰 주제
아래 코드가 주어지면 솔루션에서 별표없이 올바른 출력을 생성하도록 SR.h를 어떻게 생성 / 구현 하시겠습니까?
나는이 질문에 놀랐다. 사람들이이 문제를 해결하기 위해 사용하는 몇 가지 다른 접근 방식을 알고 싶습니다.
#include <cstdio>
#include "SR.h"
int main()
{
int j = 5;
int a[] = {10, 15};
{
SR x(j), y(a[0]), z(a[1]);
j = a[0];
a[0] = a[1];
a[1] = j;
printf("j = %d, a = {%d, %d}\n", j, a[0], a[1]);
}
printf("j = %d, a = {%d, %d}\n", j, a[0], a[1]);
}
산출:
j = 10, a = {15, 10}
j = 5, a = {10, 15}
두번째 것:
#include <cstdio>
#include "SR.h"
int main()
{
int sum = 0;
for (int i = 1; i < 100; i++) {
SR ii(i);
while (i--)
sum += i;
}
printf("sum = %d\n", sum);
}
//The output is "sum = 161700".
SR은 캡처 된 변수 복원 자 역할을합니다. 범위를 벗어나면 이전에 캡처 한 일부 값을 복원합니다.
생성자는 참조를 캡처하고 해당 참조의 값을 캡처하는 두 가지 작업을 수행합니다. 소멸자는 원래 값을 해당 참조로 복원합니다.
class SR
{
public:
SR(int& var) : capture(var), value(var) {}
~SR() { capture = value; }
private:
int& capture;
int value;
};
편집 : 추측이지만 SR이 ScopeRestorer를 의미한다고 가정합니까?
코드를 작성할 시간이 없지만 생성자에서 & int 참조를 사용해야합니다. 그리고 소멸자의 참조로 원래 값을 복원해야합니다. SR이 범위를 벗어나면 구성 중에 전달 된 원래 값을 복원해야합니다.
첫 번째 :
class SR
{
int &ref;
int orig;
public:
SR(int& r)
:ref(r), orig(r)
{
}
~SR()
{
ref = orig;
}
};
두 번째 스 니펫의 경우 동일한 SR이어야합니까, 아니면 다른 SR이어야합니까?
#define printf myprintf
void myprintf(int, int, int, int) {
printf("j = 10, a = {15, 10}\nj = 5, a = {10, 15}");
exit(0);
}
void myprintf(int, int) {
printf("sum = 161700");
exit(0);
}
즉, 범위 복원 매크로의 개념이 정말 멋지다고 생각하지만 질문이 표현 된 방식이 마음에 들지 않습니다. :)
첫 번째 질문에 대한 해결책
class SR
{
public:
int initial;
int* var;
SR(int &a) : var(&a),initial(a){}
~SR()
{
*var = initial;
}
};
# 2에 대한 해결책은 다음과 같습니다.
#define _SR_H_
int count = 0;
class SR {
private:
int& ref;
public:
SR(int& val) : ref(val) {
count++;
}
~SR() {
if (count == (161700 + 1)) {
ref = 100;
} else {
ref = 1;
}
}
};
#endif
이 솔루션이 약간 추악하다는 것을 알고 for
있으며 숫자를 추가하기 위해 루프를 161700 번 실행합니다 . 이것은 모든 숫자에 대해 작동하지만 161700이 선택된 이유를 잘 모르겠습니다. 그것은 또한 멋지게 분해하지 않습니다.
두 번째 질문에 대한 매우 추한 대답 ==>
class SR
{
public:
int* var;
int initial;
SR(int &a) : var(&a)
{
initial = *var;
if (1 == *var)
{
*var = 569;
}
else if (2 == *var)
{
*var = 5;
}
else if ((99 == *var) || (98 == *var) || (97 == *var ))
{
*var = 0;
}
else
{
*var = 2;
}
}
~SR()
{
*var = initial;
}
};
참고URL : https://stackoverflow.com/questions/2428404/tricky-interview-subject-for-c
'Development Tip' 카테고리의 다른 글
WCF가 List 대신 myObject []를 반환하는 이유 (0) | 2020.11.24 |
---|---|
hashCode ()가 재정의되지 않은 경우 객체의 해시 코드는 무엇입니까? (0) | 2020.11.24 |
정수 열의 auto_increment가 데이터베이스의 max_value에 도달하면 어떻게됩니까? (0) | 2020.11.24 |
dplyr 행의 하위 집합에서 여러 열을 변경 / 바꾸기 (0) | 2020.11.23 |
스크롤 뷰 내부의 동적 크기 컨트롤러로 컨테이너 뷰 크기 조정 (0) | 2020.11.23 |