将指针传递给自己

Posted

技术标签:

【中文标题】将指针传递给自己【英文标题】:Passing pointer to self 【发布时间】:2013-06-18 22:24:43 【问题描述】:

C++ 我有一个窗口类,父类,它创建了几个选项卡窗口,child1、child2 等。 父窗口具有每个子窗口的成员变量。我想从 child1 访问 child2,并认为我可以在 child1 的构造函数中传递一个指向 parent 的指针,并使用 parent 的指针来访问 child2。我什至不知道如何开始。我尝试了类似以下的方法,但它没有编译,从包含 (*this) 的行开始。

class CParent

public:
    CParent() ;
    CChild1 m_Child1(*this);
    CChild2 m_Child2;
    ....
;

class CChild1

public:
    CChild1(CParent *pParent) ;
    int getChild2Number(return pParent->m_Child2.m_number);
;

class CChild2

public:
    CChild2() ;
    m_number = 1;

我想知道是否有人可以帮忙 1. 在不过多改变结构的情况下编译 2. 建议建立这种关系的更好方法。

【问题讨论】:

你从哪里得到这个代码?你是自己从头写的吗?你为什么不通过读书来学习? 好吧,除此之外,您对this 的理解是完全错误的。 thisCParent*,这是构造函数所期望的。你取消引用它,导致CParent,这是错误的。 作为一个数据点,您尝试做的事情将创建依赖循环(例如CParent -> CChild1 -> CParent)。你最好将共享状态放在一个单独的类中并传递例如一个shared_ptr 给它的每个子类。 我绝对建议您花更多时间学习 C++ 语言概念和特性,尤其是封装、继承、多态性和标准模板容器。 【参考方案1】:

为孩子使用初始化列表并传递this。但是,请注意 this 的某些用法在初始化列表中是不正确的(因为该对象仍在构建中,并且某些成员尚未初始化)。

如果m_Child1需要使用m_Child2,你应该在类定义中将m_Child2放在m_Child1之上,这样它就会首先被初始化。然后你可以像这样将this 指针传递给m_Child2

struct CParent 
    CParent() : m_Child1( this )  
private:
    CChild2 m_Child2;
    CChild1 m_Child1;
;

您可以考虑只将m_Child2 传递给m_Child1,以明确数据依赖关系,提示为什么m_Child2 必须先出现,并且不提供对正在构建的对象的引用。看起来像这样:

struct CChild2;  // Forward declare the class so CChild1 can accept it
struct CChild1  // Define CChild1 first because CParent uses it for a member
    CChild1( CChild2 &child2 );
    // ...
;
// ...
struct CParent 
    CParent() : m_Child1( m_Child2 )  
private:
    CChild2 m_Child2;
    CChild1 m_Child1;
;

【讨论】:

【参考方案2】:

您的代码在声明和定义语法、成员初始化等方面存在一些严重问题。我的建议是继续使用 C++ 基础知识。

我建议为您的孩子使用动态存储,因为您的问题暗示他们可能不止两个。

class CParent;

class CChild

public:
  CChild (CParent * p_parent);
  int get_other_child_number(size_t const other_child);
  int number (void)  return m_number; 
private:
  CParent * m_parent;
  int m_number;
;

class CParent

public:
  CParent (void)  
  void add_child (void)  m_children.emplace_back(this); 
  CChild & child (size_t const child_num)  return m_children.at(child_num); 
  CChild const & child (size_t const child_num) const  return m_children.at(child_num); 
  size_t num_childs (void) const  return m_children.size(); 
private:
  std::vector<CChild> m_children;
;

CChild::CChild (CParent * p_parent) : m_parent(p_parent), m_number(p_parent->num_childs())  
int CChild::get_other_child_number(size_t const other_child)
 
  return m_parent->child(other_child).number(); 



int main()

  CParent par;
  par.add_child();
  par.add_child();
  cout << "Number of Child 0 is " << par.child(0).number() << endl;
  cout << "Number of Child 1 is " << par.child(1).number() << endl;
  cout << "Number of Child 0 from Child 1 is " << par.child(1).get_other_child_number(0) << endl;
  cout << "Number of Child 1 from Child 0 is " << par.child(0).get_other_child_number(1) << endl;

【讨论】:

以上是关于将指针传递给自己的主要内容,如果未能解决你的问题,请参考以下文章

将图像指针传递给python中的DLL函数

c ++:将指针传递给基类时访问派生类方法?

将c ++引用的地址传递给指针

将啥传递给 sqlite create_function 任意指针

C++ 将指针传递给函数 (Howto) + C++ 指针操作

为啥在这种情况下我必须将指针传递给指针