首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解决循环依赖

解决循环依赖
EN

Stack Overflow用户
提问于 2020-07-23 12:56:41
回答 2查看 68关注 0票数 2

我知道有几个循环依赖问题,但我就是解决不了这个问题。

我有两个类:ManagerManagedManager创建Managed对象,Managed基本上包装了几个Manager方法,其中一些方法是模板化的。

代码语言:javascript
复制
// Manager.h
struct Manager {

    Managed create(); // To be defined in the .cpp
    
    template <typename T>
    Managed create() {
        Managed managed(this); // Access Managed constructor
        managed.whatever<T>(); // Access templated function
        managed.whateverElse();
        return managed;
    }   
}

struct Managed {
    explicit Managed(Manager* manager) : manager(manager) {}
    
    template <typename T>
    void whatever() {
        manager->... // use the Manager pointer for whatever purpose
    }
    
    void whateverElse(); // To be defined in the .cpp

    Manager* manager;
}

无论如何,它都是一个静态库项目。

此外,可以在here中找到真正的代码。

有什么办法可以解决这个问题吗?

EN

回答 2

Stack Overflow用户

发布于 2020-07-23 13:10:48

我只是重新排序您的代码并使用PIMPL,然后我构建了一个小示例:

代码语言:javascript
复制
#include <iostream>

struct Managed;
struct Manager;

struct Managed {
    explicit Managed(Manager* manager) : manager(manager) {}

    template <typename T>
    void whatever() { }

    void whateverElse(); // To be defined in the .cpp

    Manager* manager;
};


struct Manager {

    Managed create(); // To be defined in the .cpp

    template <typename T>
    Managed* create() {
        Managed* m = new Managed(this);// Access Managed constructor
        m->whatever<T>(); // Access templated function
        m->whateverElse();
        return m;
    }
};

它可以这样编译。但在任何情况下,都应该更好地考虑这种设计。

票数 2
EN

Stack Overflow用户

发布于 2020-07-23 13:14:27

在处理依赖项时,首先要更改的是将所有实现移到所有声明之后,但要在类中实现方法。相反,在Managed类之后执行实现。

下一步是提供所有类的正向声明。例如,开始于

代码语言:javascript
复制
struct Managed;
struct Manager;

我将引用Johns的答案来提供更多的代码细节。

(当约翰意识到我想把我的评论变成一条评论时,他很友好地删除了他的回答。谢谢。我明确地引用,因为我看起来像是在隐式地这样做,编写了非常相似的代码。)John亲切地表示,编译这一点是可能的。

代码语言:javascript
复制
struct Managed;

struct Manager {

    Managed create(); // To be defined in the .cpp
    
    template <typename T>
    Managed create();
};

struct Managed {
    explicit Managed(Manager* manager) : manager(manager) {}
    
    template <typename T>
    void whatever();
    
    void whateverElse(); // To be defined in the .cpp

    Manager* manager;
};

template <typename T>
Managed Manager::create() {
    Managed managed(this); // Access Managed constructor
    managed.whatever<T>(); // Access templated function
    managed.whateverElse();
    return managed;
}   

template <typename T>
void Managed::whatever() {
    manager->create();
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63047141

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档