내 코드를 컴파일 할 수 없습니다. 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();
}
}
};
}
}
}
도움을 주셔서 감사합니다. 죄송합니다. 너무 오래.
'MenuItem ** _menuItems; '는 좀 이상하다.'std :: vector'와 같은 표준 라이브러리 컨테이너 중 하나를 사용하는 것을 고려 했습니까? –
+1 기타! – Oystein
FYI : 밑줄 뒤에 다른 밑줄이나 대문자 (예 :'_MENU_')가 오는 이름은 컴파일러 및 표준 라이브러리 구현에서 사용하도록 예약되어 있습니다. 포함 경비원에 대해 다른 명명 규칙을 사용해야합니다. –