2011-02-09 7 views
1

내 코드를 컴파일 할 수 없습니다. iterator 디자인 패턴을 추가하고 내 오류의 원인이 될 수 있다고 생각 : 클래스 ElectricMenu 생성자가 나를 걸리는 오류를 클릭하면 .. 어쩌면 가상 클래스 반복자 iterator 원인이 무엇입니까? 적절한 기본 생성자가 없습니다. iterator?

error C2512: 'guitars::Composite::InventoryParts::Menu' : no appropriate default constructor available 

나는 복합 디자인 패턴이 있고 난 이후 원인이 어쩌면 내가 잘못 인터페이스를 가지고 반복자 디자인 패턴을 통합 트링 어쩌면입니다.

여기에 오류가 발생한 코드가 나와 있습니다. 나는 아직 메인에서 아무것도하지 않고있다. 단지 컴파일 만하지 않는다. 그 원인을 범인이라고 생각하면 그 수업을 하나만 포함하게됩니다. 나는 ... possible..sorry가

#ifndef _ELECTRIC_MENU_ 
#define _ELECTRIC_MENU_ 
#include "Menu.h" 
#include "MenuItem.h" 
#include "ElectricMenuIterator.h" 

namespace guitars { 
namespace Composite { 
namespace InventoryParts { 

class ElectricMenu : public Menu { 
private: 

    static const int MAX_ITEMS = 6; 
    int _numberOfItems; 
    MenuItem** _menuItems; 



public: 
    ElectricMenu() : _numberOfItems(0)   // this is where the error takes me 
     {        
    _menuItems = new MenuItem*[MAX_ITEMS + 1]; // added one additional entry; 
    for(int i = 0; i <= MAX_ITEMS; i++) {  // to hold a null (0) value 
     _menuItems[i] = 0;      // so hasNext() will work 
    } 

    addItem("Electric","flying v", true, 2.99); 

} 


void addItem(std::string name, std::string description, bool vegetarian, double price) { 
    MenuItem* menuItem = new MenuItem(name, description, vegetarian, price); 
    if(_numberOfItems >= MAX_ITEMS) { 
     std::cerr << "Sorry, menu is full! Can't add item to menu" << std::endl; 
    } else { 
     _menuItems[_numberOfItems] = menuItem; 
     _numberOfItems++; 
    } 
} 
MenuItem** getMenuItems() const { 
    return _menuItems; 
} 
Iterator<MenuItem>* createIterator() const { 
    return dynamic_cast< Iterator<MenuItem>* >(new ElectricMenuIterator(_menuItems)); 
} 


}; 

} 
} 
} 

#endif 

반복자

#ifndef _ELECTRIC_MENU_ITERATOR_ 
#define _ELECTRIC_MENU_ITERATOR_ 
#include "Iterator.h" 

namespace guitars { 
namespace Composite { 
namespace InventoryParts { 


class ElectricMenuIterator : public Iterator<MenuItem> { 
private: 

    MenuItem** _items; 
    mutable int _position; 



public: 
    explicit ElectricMenuIterator(MenuItem** items) : 
    _items(items), _position(0) { 
} 

    MenuItem* next() const { 
    MenuItem* menuItem = _items[_position]; 
    _position++; 
    return menuItem; 
} 

    bool hasNext() const { 
    if(_items[_position] == 0) { 
     return false; 
    } else { 
     return true; 
    } 
} 
    void remove() { 
} 
}; 

} 
} 
} 

#endif 

반복자를 heres

#ifndef _ITERATOR_ 
#define _ITERATOR_ 

namespace guitars { 
namespace Composite { 
namespace InventoryParts { 

template <class T> 
class Iterator 
{ 

public: 

virtual bool hasNext() const = 0; 
virtual T* next() const = 0; 
virtual ~Iterator() = 0 { 
} 


}; 

메뉴 관심을 바랍니다 잃게 해달라고으로이 짧은을 유지하기 위해 노력하고

#ifndef _MENU_ 
#define _MENU_ 

#include "MenuComponent.h" 
#include "InventoryItem.h" 
#include "Iterator.h" 
#include <assert.h> 
#include <vector> 
#include "MenuItem.h" 


namespace guitars { 
namespace Composite { 
namespace InventoryParts { 


class Menu : public MenuComponent { 

private: 
    std::string _name; 
    std::string _description; 
    mutable std::vector< MenuComponent* > _menuComponents; 

public: 

    virtual Iterator<MenuItem>* createIterator() const = 0; 
    virtual ~Menu() = 0 { 
} 
    Menu(const std::string name, const std::string description) : 
    _name(name), _description(description) { 
} 
void add(MenuComponent* menuComponent) { assert(menuComponent); 
    _menuComponents.push_back(menuComponent); 
} 
void remove(MenuComponent* menuComponent) { assert(menuComponent); 
    //std::remove(_menuComponents.begin(), _menuComponents.end(), menuComponent); 
} 
MenuComponent* getChild(int i) const { 
    return _menuComponents[i]; 
} 
std::string getName() const { 
    return _name; 
} 
std::string getDescription() const { 
    return _description; 
} 
void print() const { 
    std::cout << std::endl << getName().c_str(); 
    std::cout << ", " << getDescription().c_str() << std::endl; 
    std::cout << "---------------------" << std::endl; 

    std::vector< MenuComponent* >::iterator iterator = _menuComponents.begin(); 
    while(iterator != _menuComponents.end()) { 
     MenuComponent* menuComponent = *iterator++; 
     menuComponent->print(); 
    } 
} 
}; 

} 
} 
} 

도움을 주셔서 감사합니다. 죄송합니다. 너무 오래.

+1

'MenuItem ** _menuItems; '는 좀 이상하다.'std :: vector'와 같은 표준 라이브러리 컨테이너 중 하나를 사용하는 것을 고려 했습니까? –

+1

+1 기타! – Oystein

+1

FYI : 밑줄 뒤에 다른 밑줄이나 대문자 (예 :'_MENU_')가 오는 이름은 컴파일러 및 표준 라이브러리 구현에서 사용하도록 예약되어 있습니다. 포함 경비원에 대해 다른 명명 규칙을 사용해야합니다. –

답변

7

Menu 클래스에는 기본 생성자가 없습니다.

Menu(const std::string name, const std::string description) 

이 때문에, 당신은 명시 적으로 ElectricMenu 생성자의 초기화 목록에서 Menu 기본 클래스 하위 객체를 초기화해야합니다 : 그것의 두 생성자는 암시 적으로 선언 복사 생성자와 사용자가 선언 된 생성자입니다.

ElectricMenu() : Menu("name", "description"), _numberOfItems(0) 

또는, Menu 클래스의 기본 생성자를 선언 할 수 있습니다; 이것이 의미가 있는지 여부는 Menu이 어떻게 사용되는지에 달려 있습니다.

+0

+1, 실질적으로 내가 쓴 것. – Oystein

+0

나는 지난 몇 시간 프로그래밍을 고맙다. 그리고 나는 피곤하다. –

관련 문제