2016-06-21 5 views
0

그래서 저는 기본 클래스 인 Furniture도 가지고 있습니다. 또한이 클래스는 추상 클래스이고 Bed, Table, Chair 및 Desk 클래스를 파생합니다. 저는 기본 클래스 Furniture에 대한 포인터 벡터를 사용하고 있습니다. 거기에서 파생 클래스의 인스턴스를 보유하고 있습니다. 가구 벡터로 작업을 수행하는 다른 클래스 금전 등록기가 있습니다. 내가 만든 파생 클래스의 복사본 생성자를 사용해야하며이 스 니펫 코드의 아이디어는 가장 안전한 방법으로 기본 클래스의 포인터 벡터에 포함 된 파생 클래스 개체를 복제하는 것입니다. 가능한. 그래서이 내 복사 생성자입니다파생 클래스의 인스턴스가있는 기본 클래스에 대한 포인터 벡터에 대해 파생 클래스의 복사 생성자를 구현하는 방법은 무엇입니까?

explicit Desk(const Desk& _desk) : Furniture(_desk),  numberOfDrawers(_desk.numberOfDrawers) {}; 
explicit Table(const Table& _table) : Furniture(_table), numberOfLegs(_table.numberOfLegs) {}; 
explicit Chair(const Chair& _chair) : Furniture(_chair), numberOfLegs(_chair.numberOfLegs) {}; 
explicit Bed(const Bed& _bed) : Furniture(_bed), size(_bed.size) {}; 

그리고 난 지금까지 생각했던 방법입니다 : 불행하게도

std::cout << "The object is found: " << furniture[index]->getName() << std::endl; 
    std::cout << "Price:    " << furniture[index]->getPrice() << std::endl; 
    std::cout << "Code:    " << furniture[index]->getCode() << std::endl; 
    std::cout << "Do you want to copy the purchase of " << furniture[index]->getName() << " ? (Y/N)"; 
    char read; 
    std::cin >> read; 
    if (read == 'Y') 
    { 
     if (furniture[index]->getName() == "Bed") { 

      Bed* deskClone = new Bed(dynamic_cast<Bed&>(*furniture[index])); 
      furniture.push_back(deskClone); 
     } 
     if (furniture[index]->getName() == "Desk") { 
      Desk* bedClone = new Desk(dynamic_cast<Desk&>(*furniture[index])); 
      furniture.push_back(bedClone); 
     } 
     if (furniture[index]->getName() == "Table") { 
      Table* tableClone = new Table(dynamic_cast<Table&>(*furniture[index])); 
      furniture.push_back(tableClone); 
     } 
     if (furniture[index]->getName() == "Chair") { 
      Chair* chairClone = new Chair(dynamic_cast<Chair&>(*furniture[index])); 
      furniture.push_back(chairClone); 
     } 
    } 

, 나는이 위험한 것을 읽고, 그래서 물어 원이 이것에 대해 더 좋은 방법이 있습니까? 은 BTW : 이것은 내 첫 번째 게시물들도 평균하지 말라입니다 : D

+0

유형 설명자를 켜면 객체 지향 프로그래밍 분야를 거의 완벽하게 발명하고, 구현하고, 승격시키고, 가져온 컴퓨터 과학자 세대의 작업을 혼자서 물리 칠 수 있습니다. '가상 가구 * 복제()'를 사용하십시오. –

+0

모든 어린이가 구현하는 기본 클래스에서 메소드를 만들 수 있나요? 예 : 복사본을 만드는 make_copy()? 그리고 shared_ptr을 사용하는 것이 좋습니다. – thorsan

답변

0

furniture.push_back(furniture[index]->clone()); 
0

으로 함께 전체 조건 수프, 기본 클래스에 순수 가상 복제 기능을 추가 어디서나 무시하고 대체 코멘트에 제안, 아이들이

class Bed 
{ 
    ... 
    virtual Furniture* copy() override 
    { 
     return new Bed(*this); 
    } 
    ... 
}; 
,691를 구현하는 기본 클래스

virtual Furniture* copy() = 0; 

에 가상 기능을

관련 문제