2012-10-08 5 views
0

검색 한 후 내 문제에 대한 조언을 찾을 수 없습니다. 내가 추상 기본 클래스에 대한 포인터를 포함하는 개인 변수를 가진 클래스에 대한 복사 생성자를 만들려고 해요.C++ 구조 기본 클래스 포인터 복사

#include "BaseClass.hh" 

ClassA::ClassA() 
{ } 
/* Copy construct a ClassA object */ 
ClassA::ClassA(const ClassA& obj) 
{ 
    std::map<std::string, BaseClass*>::const_iterator it; 
    //ClassA copy = obj; 

    for(it = obj.ind.begin(); it != obj.ind.end(); it++) 
    { 
     copy.ind[it->first]=(it->second); 
    } 
} 

//in .hh file 
private: 
std::map<std::string, BaseClass*> ind; 

나는 닫을 까? 그렇지 않다면 어떻게 해결할 수 있습니까?

+1

'for'절에 ++뿐 아니라 it ++을 의미 했습니까? –

+0

BaseClass와 ClassA는 어떻게 관련되어 있습니까? ClassA는 공개적으로 BaseClass를 상속합니까? – Jagannath

+0

내가 설명해야 할 첫 번째 문제는 왜 사용자 지정 복사본 생성자가 필요하다고 생각합니까? 당신을 위해 제공 한 것이 당신이 원했던 것이 무엇입니까? 또한 다른 사람이 지적했다 : ClassA는 BaseClass에서 상속합니까? 아니면 다른 관계입니까? – Rollie

답변

1

몇 가지 문제가 있습니다.

  1. ++it; for 루프에서 반복됩니다.
  2. ClassA copy = obj; 복사 생성자에서 돌아 오면 변수 복사본이 소멸됩니다. 그래서, 당신은 여기에 어떤 사본도하지 않습니다.
  3. 맵에 값을 포인터로 넣으려면 포인터 변수에 대한 메모리를 할당해야합니다.
  4. 맵에 BaseClass 포인터로 value이 있으므로, 메모리를 할당하려는 정확한 유형을 알아야합니다. key이 도움이 될 수 있습니다.

저는 C++ 11 태그의 자유를 여기에서 취하고 있습니다. 이것은 일러스트레이션 목적으로 만 사용됩니다. 아이디어를 가지고 필요에 맞게 구현하십시오. 네가 관찰한다면, 나는 여기서 기억을 풀어주지 않았다. 너를 위해 버려둬.

class BaseA 
{ 
public: 
    virtual void Print() = 0; 
}; 

class Derived1A : public BaseA 
{ 
    virtual void Print() 
    { 
     std::cout << "Derived1A\n"; 
    } 
}; 

class Derived2A : public BaseA 
{ 
    virtual void Print() 
    { 
     std::cout << "Derived2A\n"; 
    } 
}; 


std::map<std::string, std::function<BaseA*()>> factory; 


class ClassA 
{ 

public: 
    ClassA() 
    { 
     for (auto it = factory.begin(); it != factory.end(); ++it) 
     { 
      typedef std::pair<const std::string, BaseA*> Pair; 
      mapType_m.insert(Pair(it->first, it->second())); 
     } 
    } 

    ClassA(const ClassA& other) 
    { 
     for (auto it = other.mapType_m.begin(); it != other.mapType_m.end(); ++it) 
     {   
      typedef std::pair<const std::string, BaseA*> Pair; 
      mapType_m.insert(Pair(it->first, factory[it->first]())); 
     } 
    } 

    void Print() 
    { 
     for (auto it = mapType_m.begin(); it != mapType_m.end(); ++it) 
     { 
      std::cout << "key:" << it->first << "\tValue:"; 
      it->second->Print() ; 
      std::cout << "\n"; 
     } 
    } 

private: 
    std::map<std::string, BaseA*> mapType_m; 

}; 


int main() 
{ 
    factory["Derived1A"] = []() { return new Derived1A(); }; 
    factory["Derived2A"] = []() { return new Derived2A(); }; 


    ClassA c1; 
    ClassA c2 = c1; 
    c2.Print(); 
} 
+0

1. 주목 해 주셔서 감사합니다. 이전 while 회 돌이였습니다. 그것을 제거했다. – user1727556

+0

2.이 부분을 이해합니다. 3. 또한 메모리를 할당해야한다는 것을 이해하지만, 추상 기본 클래스이므로 BaseClass * copy = New BaseClass이므로 메모리를 할당하는 방법을 이해할 수 없습니다. 작동하지 않습니까? 나는 또한 열쇠가 여기에 도움이된다는 것을 당신이 무엇을 의미하는지 모른다. ( – user1727556

+0

와우! 나에게 이것에 대해 자세히 설명 할 시간을내어 주셔서 감사합니다. 지금 당신이 의미하는 바를 봅니다. 이것은 정말로 나를 도왔습니다. 다시 고마워요! – user1727556