簡體   English   中英

C ++將派生的結構傳遞給需要超級結構的方法

[英]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派生的結構都應具有positionname ,以便可以使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM