Получение объекта, из которого создается экземпляр объекта

#c

#c

Вопрос:

Я новичок в C , и мне не хватает некоторой терминологии (не удалось задать конкретный вопрос Google), поэтому я постараюсь быть как можно более понятным.

Допустим, я создал экземпляр объекта класса A. Затем, скажем, из метода этого объекта класса A я создаю объект класса B.

В моем классе B я хочу использовать объект класса A в качестве аргумента (передаваемого по ссылке, если это возможно).

Возможно ли это?

Спасибо.

Ответ №1:

Трудно сказать, что вы имеете в виду use the object of class A as an argument . Вы имеете в виду тот, из которого он был создан? В остальном это звучит так, как будто вы описываете циклическую зависимость. Может быть, это то, что вы ищете?

 //B.h
class A;  //DO NOT INCLUDE.  This is called "forward declaration"
class B {
    Aamp; parent;  //All `A` in this file must be reference or pointer
public:
    B(Aamp; a);
};
  

.

 //A.h
#include "B.h"
class A {
    B function();  //since it's not reference or pointer, must have include
};
  

.

 //B.cpp
#include "B.h"
#include "A.h"
void B::function(Aamp; a)
: parent(a)
{}
  

.

 //A.cpp
#include "B.h"
#include "A.h"
B A::function()
{
    return B(*this);
}
  

Имейте в виду, если B::parent это ссылка, вы не можете назначить a B другому, вы теряете всю семантику копирования. Если вам это нужно, вам придется вместо этого создать parent указатель. Что рекомендуется, но вы специально просили ссылку. Ссылка также требует, чтобы объект A оставался в памяти до тех пор, пока B он существует, что может быть сложной гарантией.

Комментарии:

1. Кроме того, это называется прямым объявлением.

Ответ №2:

Да, в вашем методе class A вы можете ссылаться на текущий экземпляр A , используя ключевое this слово. Например, вы можете предоставить this для class A конструктору class B .

Мой синтаксис C немного устарел, поэтому вот пример C #, который можно довольно буквально перевести на C :

 public class A
{
    public void MyMethod()
    {
        B b = new B(this);
    }
}

public class B
{
    public B(A parent) { // Do something with A, maybe store it in B for later reference
    }
}
  

Комментарии:

1. Хорошо, может быть, я недостаточно ясно выразился, но я действительно искал что-то подобное. Спасибо всем за вашу помощь, очень признателен.

Ответ №3:

Вам нужно будет передать создающий объект в конструктор в качестве ссылки:

 B b(*this);
  

Где у вас есть:

 class B {
public:
   B(const A amp;creator_) : creator(creator_) { }

private:
   const Aamp; creator;
}
  

;