2009-09-07 4 views
0

난 카드 생성기에 대한 명명 된 매개 변수 생성자를 만들려면 Boost Parameter 자습서를 사용하고 있습니다. 이 튜토리얼에서는 ArgumentPack을 기본 클래스에 넣으려고하지만 카드 생성기 클래스에서 변수를 수정하려고합니다. 나는이 일에 대해 생각했습니다부스트 매개 변수에 대한 기본 클래스가있는 친구 사용

class CGconstructor_base { 
public: 
     template<class ArgumentPack> 
     CGconstructor_base(ArgumentPack const& args);/*tutorial says to put code 
     in this function */ 
     friend CardGenerator;//so it can modify the variables of CardGenerator 
} 
class CardGenerator:public CGconstructor_base; 

이 합법적인가 또는 부스트 매개 변수 라이브러리를 CardGenerator의 개인 변수를 조작하고 사용할 수있는 더 나은 방법이 있나요? 운영 체제 : Windows XP Pro, 컴파일러 : Visual C++ 2008 Express, 부스트 : 1.39.0

답변

1

정리가 필요하다고 생각합니다. 이 그렇다면, 그 친구 선언 (나는 내 ​​친구로 생각하는 사람들 말을 CardGenerator로 전환 :

  1. 친구 선언은 코멘트에서 당신이 CGconstructor_base이 CardGenerator 속성에 액세스 할 수 있도록하려면, 잘못 배치 보인다 , 당신은 내가 친구라고 생각하는 사람으로 자신을 선언하지 않습니다.)

  2. 어쨌든 친구가 필요하십니까? 튜토리얼에서와 같이 구조체를 사용하고 CGconstructor_base에 속성을 채운다면 훨씬 더 좋을 것입니다. 이렇게하면 보충 선없이 CardGenerator에서 자연스럽게 액세스 할 수 있습니다. 'friend'키워드 없이도 할 수있을 때 (평상시주의 : 그렇게하면 비용이 너무 많이 들지 않습니다.)

  3. 여기에서 상속인 상속은 세부 구현입니다. 다른 클래스/메소드가 자신을 '기반'으로 사용하는 것을 알아야 할 때만 공개 상속을 사용하거나 보호됩니다. 간단히 말해서

은 '상속'대신 세정제 조성물 (내 생각)의 향상에 의해 선정 된 이유

struct CGconstructor_base { 
     template<class ArgumentPack> 
     CGconstructor_base(ArgumentPack const& args);/*tutorial says to put code 
     in this function */ 

     cg_type1 cg_attr1; 
     cg_type2 cg_attr2; 
}; // don't forget this 

class CardGenerator:private CGconstructor_base {}; 

궁금 않습니다. 상속을 남용하는 것이 훨씬 쉽습니다 (다중 상속이 필요합니다) ... 나는 그것이 자신의 주제에 가치가 있다고 생각합니다.

+0

고마워요! 나는 친구 선언을 망쳤다는 것을 믿을 수 없다. – mmoran