Есть ли какие-либо негативные последствия использования указателей базовых классов на производные классы в c ++? - PullRequest
1 голос
/ 15 июля 2011

Я обычно избегаю использования указателей классов, поскольку ссылки кажутся более эффективными.Но недавно я был вынужден использовать их, поскольку они представляют единственное (эффективное и простое) решение для привязки функций с идентификаторами окон в моей оболочке api windows.Я создал массив класса WinControl.в моем классе WinHandler, который обрабатывает WndProc (оконная процедура) и добавляет все виджеты, используемые в программе, в этот массив.

class WinControl   //These are not the entire classes, just the significant parts.
{
    public:
        int WinID;
        virtual void Click(void) = 0; //Pure Virtual Function.
}

class WinHandler
{ 
    WinHandler() : WCount(0) { }
    WinControl* WidgetSet[MAX_LENGTH];   // Or I can use an STL vector...
    int WCount;
    void AddWidget(Widget* w) { WCount++; WidgetSet[WCount] = w; }
}         

Затем я использую:

if (WidgetSet[i]->ID == LOWORD(wParam)) WidgetSet[i]->Click();

Будет ли этоподход будет хорошо в долгосрочной перспективе?Поскольку Объекты, фактически сохраненные в WidgetSet, будут производными от класса WinControl.Кто-нибудь может предложить лучший подход?

ПРИМЕЧАНИЕ. Я постарался сделать свой вопрос максимально четким.Если вы все еще не можете получить то, что я спрашиваю, пожалуйста, прокомментируйте, и я постараюсь уточнить вопрос.

Ответы [ 2 ]

6 голосов
/ 15 июля 2011

То, что вы храните в наборе виджетов, это указатель.НЕ объект.Проблема с вашим дизайном заключается в том, что неясно, кто должен владеть объектом, поэтому уничтожить его.

Я бы изменил интерфейс, чтобы сделать владение явным.

Опция 1:

WinHandler владеет НЕ владельцем виджета:

void AddWidget(Widget& w) { WCount++; WidgetSet[WCount] = &w; }

Опция 2:

WinHandler Принимает право собственности на виджет

void AddWidget(std::auto_ptr<Widget> w) { WCount++; WidgetSet[WCount].reset(w); }
std::auto_ptr<WinControl> WidgetSet[MAX_LENGTH];

Опция 2a:

(для тех, у кого более новые компиляторы)
WinHandler Принимает право собственности на виджет

void AddWidget(std::unique_ptr<Widget>& w) { WCount++; WidgetSet[WCount] = std::move(w); }
std::unique_ptr<Widget> WidgetSet[MAX_LENGTH];

Опция 3:

(для тех, у кого более новые компиляторы)
WinHandler доля владение виджетом

void AddWidget(const std::shared_ptr<Widget>& w) { WCount++; WidgetSet[WCount] = w; }
std::shared_ptr<Widget> WidgetSet[MAX_LENGTH];
0 голосов
/ 15 июля 2011

Решение в порядке, но следите за утечкой памяти: не забудьте удалить все:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...