2017-11-05 9 views
0

초기화 목록에 정의 된 값을 재정의하는 데 문제가있는 경우가 있습니다. 이 복사 생성자에서 다시 정의하고 싶습니다. 나는 약간의 샘플 코드를 던질 것이다. 또한 내 복사 생성자의 for 루프에 들어가면 프로그램이 중단되는 문제가 있습니다. 야생 일이 뭐라구? for 루프를 충돌없이 만들지 않는 것 같습니다.C++ 복사 생성자에서 목록 할당 초기화 및 복사 생성자에서 충돌 발생

class Calculator : public Tool { 
private: 

    int numberKeys; 

    Tool** tools; 

public: 

    Calculator(); 
    Calculator(const Calculator& obj); 

CPP에 파일 : 헤더 파일에

내가 제대로 질문을 이해한다면

Calculator::Calculator() 
:Tool("MyCalculator"), 
numberKeys(0), 
tools(nullptr) 
{ 
} 

Calculator::Calculator(const Calculator& obj) 
{ 

numberKeys=obj.numberKeys; 
tools = new Tool*[numberKeys]; 

*****How do I define  :Tool("MyCalculator"), 
*****to     :Tool("YourCalculator"), 

for (int x = 0; x < numberKeys; x++){ 
    this->tools[x] = (obj.tools[i]->clone()); 

} 

} 

답변

1

, 당신은 기본 생성자를 원하고 Calculator에 대한 생성자를 복사는 서로 다른 문자열을 전달하는 부모 (기본) 클래스

이렇게하려면 기본 생성자에 사용 된 것과 동일한 할당 목록 형식을 사용하십시오.

Calculator::Calculator(const Calculator& obj) 
: Tool("YourCalculator"), numberKeys(obj.numberKeys) { 
    tools = new Tool*[numberKeys]; 
    for (int i = 0; i < numberKeys; i++) tools[i] = obj.tools[i]->clone(); 
} 

여분의 몇 코딩 팁 : 그래서 복사 생성자의 정의는 모양을 멤버 변수를 delcaring 때

  1. , 나는 지역 변수에서 destinguish하는 m_ 또는 _ 접두사를 사용합니다. 이렇게하면 this을 계속 사용할 필요가 없어 장기적으로 코딩 속도를 높일 수 있습니다.
  2. for 루프에서 사용하는 임시 유효성을 확인하십시오. int x = 0을 선언 한 다음 i이 로컬 범위에없는 경우 obj.tools[i]을 사용했습니다.
  3. //을 사용하여 코드를 주석 처리하거나 /* comment */으로 주석 블록을 둘러 쌀 수 있습니다. *****은 코드를 주석 처리하지 않습니다.
  4. 가능한 경우 멤버 변수를 nullptr으로 초기화하는 것을 삼가합니다. 나중에 포인터를 조작하려고하면 혼란 스러울 수 있습니다. null 포인터 오류가 발생할 수 있습니다.
+0

감사합니다. 매우 도움이되는 답변입니다. – Busta