C ++ | 如何解决这个类间依赖问题?

用户名

我向您提供MWE:

#include <iostream>


class C;


class A
{
    public:

    A(C &cc)
        : c(cc)
    {
    }

    int functionA()
    {
        return 0;
    }

    C &c;
};


class B
{
    public:

    B(C &cc)
        : c(cc)
    {
    }

    int functionB()
    {
        return c.a.functionA();
    }

    C &c;
};


class C
{
    public:

    C()
        : a(*this)
        , b(*this)
    {
    }

    int functionC()
    {
        return b.functionB();
    }

    A a;
    B b;
};


int main()
{
    C c;
    std::cout << c.functionC() << std::endl;
}

以及相关的编译器错误:

main.cpp: In member function ‘int B::functionB()’:
main.cpp:37:16: error: invalid use of incomplete type ‘class C’
   37 |         return c.a.functionA();
      |                ^
main.cpp:5:7: note: forward declaration of ‘class C’
    5 | class C;
      |       ^

可能不需要进一步说明,但是,class C到达line时尚未完全定义return c.a.functionA()

解决这一相互依存问题的最合适方法是什么?

如果有助于指导,请考虑以下内容

C = Host
A = CPU
B = RAM

我的项目中发生此问题的实际代码是

void CPU::MemFetchByte(byte &ret, const addr_t addr)
{
    HardwareDevice::host.memory.GetByte(ret, addr);
}

也许这是有用的附加信息,也许不是。

此外,我尝试将问题反转如下

#include <iostream>


//class C;
class A;
class B;



class C
{
    public:

    C()
        : a(new A(*this))
        , b(new B(*this))
    {
    }

    ~C()
    {
        delete b;
        delete a;
    }

    int functionC()
    {
        return b->functionB();
    }

    A *a;
    B *b;
};


class A
{
    public:

    A(C &cc)
        : c(cc)
    {
    }

    int functionA()
    {
        return 0;
    }

    C &c;
};


class B
{
    public:

    B(C &cc)
        : c(cc)
    {
    }

    int functionB()
    {
        return c.a->functionA();
    }

    C &c;
};


int main()
{
    C c;
    std::cout << c.functionC() << std::endl;
}

但是,这(如预期的那样)使情况变得更糟而不是更好:

main.cpp:16:24: error: invalid use of incomplete type ‘class A’
   16 |         : a(new A(*this))
      |                        ^
main.cpp:6:7: note: forward declaration of ‘class A’
    6 | class A;
      |       ^
main.cpp:17:24: error: invalid use of incomplete type ‘class B’
   17 |         , b(new B(*this))
      |                        ^
main.cpp:7:7: note: forward declaration of ‘class B’
    7 | class B;
      |       ^
尔杰

通过将构造函数和成员函数实现移出类声明来使用完整类型。

#include <iostream>

class A;
class B;
class C;

class A { 
public:
    A(C &cc);
    int functionA();
    C &c; 
};
class B { 
public:
    B(C &cc);
    int functionB();
    C &c; 
};
class C { 
public:
    C();
    int functionC();
    A a;
    B b;
};

int main()
{
    C c;
    std::cout << c.functionC() << std::endl;
}

A::A(C &cc) : c(cc)
{ }

int A::functionA() {
    return 0;
}

B::B(C &cc) : c(cc)
{ }

int B::functionB() {
    return c.a.functionA();
}

C::C() : a(*this), b(*this)
{ }

int C::functionC() {
    return b.functionB();
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在c ++中传递内联临时类需要为const。如何解决这个问题

我应该如何解决这个 C++ 排序问题

如何解决这个循环依赖问题?

我该如何解决这个奇怪的 c++ std map 问题?

C# 颜色代码无法正常工作我该如何解决这个问题?

如何解决C和函数指针中的循环依赖问题

提供类模板如何解决无效的 constexpr 依赖项?C++

如何解决这个问题,即我的 2D 数组不会在 C++ 中输出它的值?

如何解决这个libgomp1依赖问题?

你如何解决节点中的这个循环依赖问题

如何解决这个问题?

如何解决这个前向类声明问题?

如何用C ++代码解决这个cmake问题?

如何解决目标c中的日期格式问题

如何解决Objective-C中的HackerRank问题

如何解决iOS Objective-C时区问题?

如何解决此C ++访问冲突问题?

如何解决C中的gets()函数问题?

如何解决 C# 中的简单变量问题?

如何解决 XAML C# 中的动画问题?

C ++:当两个类包含指向另一个的指针时,如何解决派生类之间的模板循环依赖关系?

如何解决C ++错误:“类”的重新定义

显示“Press 'Ctrl'+'C'”以取消正在进行的文件系统检查。有人知道如何解决这个问题吗?

cvc-complex-type.2.4.c:匹配的通配符是严格的,但是找不到元素'oai-identifier'的声明。如何解决这个问题?

c#:特定 dll 的 DLLImport 不起作用,尽管示例应用程序显示它可以工作,我该如何解决这个问题?

如何解决这个Maven的依赖地狱

如何解决eclipse交叉编译c/c++错误。符号无法解决问题

带有C#的ms-graph API;如何解决这个driveitem错误

C ++类重新定义错误-我无法终生解决这个问题