2012-05-02 3 views
0

코딩 할 작은 프로그램의 메뉴 구조를 구현하려고합니다.벡터 클래스 멤버가 복사되지 않습니다.

Label, 관련 함수, 상위에 대한 링크 및 하위에 대한 참조를 포함하는 벡터를 포함하는 MenuItem이 있습니다. 그런 다음 새로운 MenuItem을 선택하는 일을 주로 담당하는 Menu가 있으며 현재 어떤 Item이 활성 상태인지 추적합니다. 불행히도 Menu에서 MenuItem을 사용하고 현재 MenuItem을 해당 자식 중 하나로 변경하면 다음 자식 목록이 비어있어 더 이상 사용할 수 없습니다. 벡터가 제대로 복사되지 않는 것 같습니다. 복사 생성자를 구현하려고했지만 도움이되지 않았습니다. 다음은 나의 근원이다.

#include <iostream> 
#include <sstream> 
#include <string> 
#include <vector> 

typedef void (*fptr)(int); 

using namespace std; 

void test(int i) 
{ 
    cout << "test function called with argument: " << i << endl; 
} 

class MenuItem 
{ 
private: 
    vector<MenuItem*> children; 
    string label; 
    fptr f; 
    MenuItem* parent; 
public: 
    MenuItem(string newLabel, fptr newFunction = NULL):label(newLabel),f(newFunction) 
    { 
    } 

    void addChild(MenuItem& mi) 
    { 
     mi.parent = this; 
     children.push_back(&mi); 
    } 

    MenuItem* getChild(int i) 
    { 
     return children[i]; 
    } 

    MenuItem* getParent() 
    { 
     return parent; 
    } 

    string getLabel() 
    { 
     return label; 
    } 

    int countChildren() 
    { 
     return children.size(); 
    } 

    void list() 
    { 
     vector<MenuItem*>::iterator i; 
     for(i = children.begin(); i < children.end(); ++i) 
     { 
      MenuItem* m = *i; 
      label = m->label; 
      stringstream s; 
      s << (i - children.begin()); 
      cout << s.str() << ": " << label << endl; 
     } 
    } 

    void invoke(int i) 
    { 
     f(i); 
    } 
}; 

class Menu 
{ 
private: 
    MenuItem* current; 
public: 
    Menu(MenuItem* m) 
    { 
     current = m; 
     open(0); 
    } 

    void open(int i) 
    { 
     current = current->getChild(i); 
     if(current->countChildren() > 0) 
     { 
      cout << "[" << current->getLabel() << "]" << endl; 
      current->list(); 
     } 
     else 
      current->invoke(i); 
    } 

    void back(int i) 
    { 
     current = current->getParent(); 
    } 
}; 

int main() { 
    MenuItem m1("Root"); 
     MenuItem m2("List Media"); 
      MenuItem m6("List Movies",&test); 
      MenuItem m7("List Music",&test); 
      MenuItem m8("List Games",&test); 
      MenuItem m9("List Books",&test); 
     MenuItem m3("Find Media"); 
      MenuItem m10("Find Movies",&test); 
       MenuItem m14("Find by title",&test); 
       MenuItem m15("Find by genre",&test); 
      MenuItem m11("Find Music",&test); 
       MenuItem m16("Find by title",&test); 
       MenuItem m17("Find by genre",&test); 
      MenuItem m12("Find Games",&test); 
       MenuItem m18("Find by title",&test); 
       MenuItem m19("Find by genre",&test); 
      MenuItem m13("Find Books",&test); 
       MenuItem m20("Find by title",&test); 
       MenuItem m21("Find by genre",&test); 
     MenuItem m4("Add Media"); 
      MenuItem m22("Add Movie",&test); 
      MenuItem m23("Add Music",&test); 
      MenuItem m24("Add Game",&test); 
      MenuItem m25("Add Book",&test); 
     MenuItem m5("Delete Media"); 
      MenuItem m26("Add Movie",&test); 
      MenuItem m27("Add Music",&test); 
      MenuItem m28("Add Game",&test); 
      MenuItem m29("Add Book",&test); 

    m1.addChild(m2); 
     m2.addChild(m6); 
     m2.addChild(m7); 
     m2.addChild(m8); 
     m2.addChild(m9); 
    m1.addChild(m3); 
     m3.addChild(m10); 
      m10.addChild(m14); 
      m10.addChild(m15); 
     m3.addChild(m11); 
      m11.addChild(m16); 
      m11.addChild(m17); 
     m3.addChild(m12); 
      m12.addChild(m18); 
      m12.addChild(m19); 
     m3.addChild(m13); 
      m13.addChild(m20); 
      m13.addChild(m21); 
    m1.addChild(m4); 
     m4.addChild(m22); 
     m4.addChild(m23); 
     m4.addChild(m24); 
     m4.addChild(m25); 
    m1.addChild(m5); 
     m5.addChild(m26); 
     m5.addChild(m27); 
     m5.addChild(m28); 
     m5.addChild(m29); 

    Menu m(&m1); 

    int option; 
    while(1){ 
     cout << "Media Library> "; 
     cin >> option; 
     m.open(option); 
    } 
} 
+0

복사 생성자가 없습니다. 그리고, 여러분은 아이들의'vector'를 전혀 복사하지 않습니다. – Chad

+0

예상되는 출력은 무엇이며 어떤 결과를 얻고 있습니까? – deebee

답변

0

이 문제는 메뉴 생성자의 open(0); 인 것 같습니다. 이것은 물론 당신이 더 이상 하위 섹션이없는 "미디어 목록"섹션으로 자동으로 내려 가게합니다.

current->list();

+0

그게 다야! 고맙습니다. 나에게 밤 세션을 저장 :) – tim

관련 문제