gpt4 book ai didi

c++ - 如何从 PIMPL 模式中的嵌入式类访问父方法

转载 作者:行者123 更新时间:2023-11-28 01:01:52 24 4
gpt4 key购买 nike

我发现了一个类似的问题here ,但我的意图略有不同。

B类是嵌入类,A类是嵌入类。我想让B::A访问B类的成员函数。我通过g++ (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2看到编译错误。详细错误如下:

~/Documents/C++ $ g++ embed.cpp 
embed.cpp:5:7: error: ‘B’ has not been declared
embed.cpp: In constructor ‘B::B()’:
embed.cpp:10:27: error: invalid use of incomplete type ‘struct B::A’
embed.cpp:14:9: error: forward declaration of ‘struct B::A’

有什么方法可以让它发挥作用吗?谢谢

#include <iostream>
#include <string>
using namespace std;

class B
{
public:
B() : impl(new B::A(this)) {}
~B(){}

private:
class A; // want to hide the implementation of A
A* impl;
};

class B::A
{
public:
A(B* _parent) : parent(_parent) {} // let embedded class A has access to this parent class
~A() { parent = NULL; }

B* parent;
};

int main(void)
{
return 0;
}

最佳答案

如果您遵循将 header 放在一个文件中,将实现放在另一个文件中的约定,这个问题就很容易解决。

在文件 b.h 中:

class B
{
public:
B();
~B();

private:
class A; // want to hide the implementation of A
A* impl;
};

class B::A
{
public:
A(B* _parent);
~A();

B* parent;
};

在文件 b.cpp 中:

B::B(void)
:impl(new A(this))
{

}

//other methods and such

我的编译器给我一个不同的错误:在 B 的构造函数中,您默认构造了一个没有默认构造函数的对象(因为它是一个不完整的类)。解决方案是在完全定义类 A 之后实现 B 构造函数,而 header /实现分离是实现该目标的自然方式。

关于c++ - 如何从 PIMPL 模式中的嵌入式类访问父方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8320647/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com