본문 바로가기

번역/Bjarne Stroustrup's C++ Style and Technique FAQ27

Why can't I assign a vector<Apple*> to a vector<Fruit*>? 왜 vector에 vector를 대입할 수 없나요? 왜냐하면 타입 시스템에 구멍을 낼 수 있기 때문입니다. 예를 들자면: class Apple : public Fruit { void apple_fct(); /* ... */ }; class Orange : public Fruit { /* ... */ }; // Orange에는 apple_fct()가 없음 vector v; // Apple들의 vector void f(vector& vf) // 순수하게 Fruit를 조작하는 함수 { vf.push_back(new Orange); // fruit를 담는 vector에 Orange를 추가함 } void h() { f(v); // error: vector를 vector로 전달할 수 없음 for (int i=0; .. 2020. 3. 4.
Why can't I define constraints for my template parameters? 왜 템플릿 파라미터에 제약을 둘 수 없는건가요? 글쎄요, 꽤 쉽게 일반적으로 할 수 있습니다. 다음 예제를 생각해봅시다 : template void draw_all(Container& c) { for_each(c.begin(),c.end(),mem_fun(&Shape::draw)); } 위의 예제에 타입 에러가 있다고 하면, 상당히 복잡한 for_each() 호출에서 해결을 해야 할것입니다. 예를 들자면, 만약 container 요소의 타입이 int라고 하면, for_each() 호출과 관련된 발견하기 어려운 오류들이 발생할 것입니다. (왜냐하면 int 타입에서 Shape::draw()를 호출할 수 없기 때문입니다.) 이런 오류를 미리 발견하기위해 다음과 같이 작성할 수 있습니다: template voi.. 2020. 3. 4.
Can I use "new" just as in Java? Java처럼 "new"를 사용해도 되나요? 어느정도는 가능하지만, 무작정 사용하지는 말고, 때로는 더 나은 대안이 있을 수 있습니다. void compute(cmplx z, double d) { cmplx z2 = z+d; // c++ style z2 = f(z2); // use z2 cmplx& z3 = *new cmplx(z+d); // Java style (assuming Java could overload +) z3 = f(z3); delete &z3; } z3의 서투른 new의 사용은 불필요할 뿐더러 관용적으로 사용하는 로컬 변수 (z2) 와 비교해서 느리기까지 합니다. 객체를 생성할 때 같은 스코프에서 해당 객체를 "delete"를 할 경우에는 "new"를 사용할 필요가 없습니다. 이런 객체는.. 2019. 12. 9.
Why doesn't overloading work for derived classes? 파생 클래스에서 오버로딩이 안 되는 이유가 무엇인가요? (많은 비슷한 질문들에서) 이 질문은 보통 몇몇 사람들이 잘못 예측하는 다음의 예제 때문에 나오게 되는데, #include using namespace std; class B { public: int f(int i) { cout 2019. 12. 9.