[英]C++ pass derived struct to method expecting the super struct
我正在嘗試使用C ++和OOP為arduino創建菜單庫。
我有一個結構稱為:
struct MenuItem {
int position;
String name;
MenuItem(int position, String name) : position(position), name(name) { };
};
我有一個派生的結構稱為:
struct SpecificMenuItem : MenuItem {
int count;
SpecificMenuItem(int position, String name, int count) : MenuItem(position, name) , count(count) { };
};
如何將SpecificMenuItem
結構的數組傳遞給需要MenuItem
數組的方法? 這里的想法是,所有從MenuItem
派生的結構都應具有position
和name
,以便可以使用Menu
類中的以下方法呈現一個簡單列表:
Menu::Menu() {
}
void Menu::setMenuItems(MenuItem *menuItems) {
this->mMenuItems = menuItems;
}
void Menu::render(void) {
for (int j = 0; j < this->mMenuItemSize; j++) {
Serial.println(this->mMenuItems[j].name);
}
}
specific_menu.h的頭文件:
class SpecificMenu : public Menu {
struct SpecificMenuItem mSpecificMenuItem[2] = {
{1, "Name", 3},
{2, "Name 2", 4}
};
public:
SpecificMenu();
};
specific_menu.cpp的cpp文件:
SpecificMenu::SpecificMenu() : Menu() {
this->setMenuItems(this->mSpecificMenuItem);
this->setMenuItemsSize(2);
}
現在的問題是, SpecificMenuItem
結構中具有額外的count
成員會導致程序崩潰,但是,如果我刪除count
成員,則程序可以正常運行,但是我認為這只是a幸。 很樂意為您提供一些有關如何使以上內容正常工作的指導。
干杯!
你不能傳遞數組SpecificMenuItem
以等待陣列的方法MenuItem
,即使SpecificMenuItem
繼承自MenuItem
。
一種可能的方法是刪除setMenuItems
方法並利用多態來訪問菜單的大小和項目:
class Menu {
protected:
virtual size_t size () const = 0;
virtual MenuItem& operator[] (size_t) = 0;
};
class SpecificMenu : public Menu {
SpecificMenuItem mSpecificMenuItem[2] = {
{1, "Name", 3},
{2, "Name 2", 4}
};
protected:
virtual size_t size () const { return 2; }
virtual const MenuItem& at (size_t i) const {
return mSpecificMenuItem[i];
}
public:
SpecificMenu();
};
然后在Menu::render
使用這些方法:
void Menu::render(void) {
for (int j = 0; j < this->size(); j++) {
Serial.println(this->at(j).name);
}
}
這使您的Menu
充當“ MenuItem&
”的(抽象)容器。
您最好聲明以下內容:
typedef std::list<MenuItem *> MenuItemArray;
然后,您可以通過指針訪問基類。
void
Menu::setMenuItems(const MenuItemArray& menuItems)
{
this->mMenuItems = menuItems;
}
void
Menu::render(void)
{
for (int j = 0; j < this->mMenuItems.size(); j++) {
Serial.println(this->mMenuItems[j]->name);
}
}
之后,如果您需要訪問SpecificMenuItem
元素:
...
SpecificMenuItem *specificItem = dynamic_cast<SpecificMenuItem *>(mMenuItems[i]);
if (specificItem) {
...
}
您最初編寫的解決方案看起來像是C解決方案,而不是C ++ IMHO。
玩得開心。
您的問題是,您不能將不同的結構/類放在同一數組中,因為它們的大小不同。 考慮建立一個指向基類對象的指針數組,因為它們也可以指向派生類。 喜歡
typedef MenuItem * MenuItemPtr;
typedef MenuItemPtr * MenuItemPtrArray;
MenuItemPtrArray myArr= new MenuItemPtr[2];
myArr[1] = new MenuItem(/*...*/);
myArr[2] = new SpecificMenuItem(/*....*/);
當然,您可以使用std::list
或其他集合,如他的答案中建議的@Holt,這將是更好的解決方案。 但是我想您在為arduino編寫時沒有它,因為它沒有stl
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.