具有指向自身指针的类层次结构
Classes hierarchy having pointer to themself
我有一个类a,需要一个指向AA的指针才能工作,这是构造函数所要求的。我有一个从a继承的类B,为a提供了一个从AA继承的类BB。示例:
class A
{
public:
class AA
{
virtual void do_something() const;
};
protected:
const AA* aa;
public:
A(const A::AA* aa_) : aa(aa_) {}
void use() const { this->aa->do_something(); }
};
class B : public A
{
public:
class BB : public A::AA
{
virtual void do_something() const;
};
public:
B() : A(new BB()) {}
};
现在,我想把B实例的地址给BB实例。类似的东西:
class B : public A
{
public:
class BB : public A::AA
{
BB(B* b);
virtual void do_something() const;
};
public:
B() : A(new BB(this)) {}
// It doesn't work beacause the instance is not yet created
};
或者类似的东西:
class B : public A
{
public:
class BB : public A::AA
{
virtual void do_something() const;
void setPointer(B* b);
};
public:
B() : A(new BB()) { static_cast<BB*>(this->aa)->setPointer(this); }
// It doesn't work because this->aa is const
};
我该怎么做有没有解决这类问题的设计模式?
如果您只希望BB:BB存储指针,则
B() : A(new BB(this)) {}
应该还可以。
如果你想让它使用指针,那么你最好的选择是将指针存储在构造函数中,并在第二个函数中使用,如下所示:
B() : A(new BB(this)) { static_cast<const BB*>(this->aa)->UseStoredThis();
这假设您可以将UseStoredThis
标记为const。如果没有,那么您将需要:
B() : A(new BB(this))
{
const auto pcBB = static_cast<const BB*>(this->aa);
const auto pBB = const_cast<BB*>(pcBB);
pBB->UseStoredThis();
}
将AA::do_something
设为公共的或受保护的,并将BB
的构造函数设为公共,这将使代码可编译。
重构一点你也可以得到一个不错的版本:
class A {
public:
struct AA {
virtual void do_something() const;
};
A(A::AA const* aa_) : aa(aa_) {}
void use() const { this->aa->do_something(); }
protected:
AA const* aa;
};
struct B : public A {
struct BB : public A::AA {
BB(B* b) {}
virtual void do_something() const override;
};
B() : A(new BB(this)) {}
};
现场演示
相关文章:
- 如何重构类层次结构以避免菱形问题
- 指针或结构的矢量
- C++ 中模板化类型的类层次结构
- 包含矢量指针的结构的内存释放问题
- 尝试将指针与结构一起使用时出错
- 为什么不同类型层次结构的指针之间的dynamic_cast定义得很好?
- 继承层次结构并将元素添加到向量
- C++ 类层次结构中的"对齐"是什么意思?
- 相同的层次结构,访问基类的受保护成员时的行为不同
- 确定大层次结构中基本指针的实际类型,无需dynamic_cast
- 在访问类的树层次结构中的对象时避免使用 null 指针
- dynamic_cast强制转换为指向不在层次结构中的类的指针
- 具有向下强制转换函数指针的类层次结构
- 对象层次结构员工程序 - 取消引用 cout 的指针
- 指向类层次结构的派生部分的指针
- 通过指针在 gdb/Eclipse CDT 调试监视中显示真实的对象层次结构
- 具有指向自身指针的类层次结构
- 指向层次结构中类的指针相等
- c++:指针数据成员在类继承层次结构中的行为
- c++指针和类层次结构导致段错误难题