#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;
}
;