C ++组合最佳实践

时间:2011-11-06 19:24:23

标签: c++ oop memory-management

我在为我的问题选择最佳解决方案时遇到了麻烦。目前,我正在开发我的第一个C ++项目,我正在使用Qt BTW,但因为我是一名.NET开发人员,所以有些事情让我对C ++有点兴趣:)。 众所周知,在一个收集行星的世界中,例如Java或.NET,最好的做法是将松散耦合类使用依赖注入,使其更易于测试和维护,但我不知道在C ++中该做什么。 C ++没有GC,所以我们应该关注每一个内存分配,这会引起太多问题。

例如,我有一个“Rule”类,其成员字段指向“Application”类:

class Rule : public QObject
{
public:
    explicit Rule(QObject *parent = 0);

    unsigned int id();
    void setId(unsigned int id);

    Application* application();
    void setApplication(Application* application)
    {
        m_Application = application
        m_Application->setParent(this);
    }

};

在构造函数中,我将NULL分配给应用程序实例变量。在setApplication中,我将其指定为应用程序的父级。感谢Qt,当Rule(父)被销毁时,应用程序实例将被自动删除。这是一个好方法吗?如果我使用QSharedPointer等智能指针代替Application *会更好吗?你有什么经验,有什么缺点,什么是最好的方法。我很乐意听你的意见。此外还有另一个棘手的部分。如果我将该课程提供给团队中的其他开发人员,或者我发布了该库,该怎么办?开发人员可以轻松地编写类似的内容:

Application app;
app.setId(1);
Rule rule;
rule.setApplication(&app); //When rule will be destroyed, the program would crash because app is allocated on the stack.

Application *app = new Application();
app->setId(20);
Rule *rule = new Rule();
rule->setApplication(app);
Application *appToAnotherLocation = new Application();
rule->setApplication(appToAnotherLocation); // This wouldn't result in memory leak, because app is already child of rule, but if I didn't used Qt this would be a problem... probably :)

那么智能指针呢?是否有一些规则,什么时候应该使用它们,什么时候不应该?我有一个IRepository接口,它总是返回QSharedObject而不是指针。这是一个好方法还是我过度使用它?

class IRepository
{
public:
    virtual bool save(Application & application) = 0;
    virtual bool save(Rule & rule) = 0;
    virtual bool save(History & history) = 0;

    virtual bool remove(Application & application) = 0;
    virtual bool remove(Rule & rule) = 0;
    virtual bool remove(History & history) = 0;

    virtual QSharedPointer<Application> getApplication(unsigned int id) = 0;

    virtual QSharedPointer<Rule> getRule(unsigned int id) = 0;
    virtual QList< QSharedPointer<Rule> > getRules(unsigned int applicationId) = 0;

    virtual QSharedPointer<History> getHistory(unsigned int id) = 0;
    virtual QList< QSharedPointer<History> > getHistories(unsigned int applicationId) = 0;
    virtual QList< QSharedPointer<History> > getHistories(unsigned int applicationId, QDateTime dateFrom, QDateTime dateTo) = 0;
};

感谢。 非常感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

主观意见;

首先:像Chris说的那样,智能指针是内存泄漏的一个很好的选择。尽量一直使用它们。

第二:一个好的设计方法是仅在创建者中删除指针。我的意思是,一个类创建并销毁它们的指针。不要删除其他类中的指针,这样可以让您拥有更清晰,可读和可维护的代码。

在您的示例中,Rule'必须'不删除应用程序指针。想想你的设计:我不明白规则为什么是应用程序父级。我认为应用程序可以使用很多规则。

答案 1 :(得分:1)

如其他人所述,使用智能指针来表达所有权。使用Qt时,您应该阅读Memory management in Qt?