C++ c++;如何在另一个类中获取指向当前对象的指针?

C++ c++;如何在另一个类中获取指向当前对象的指针?,c++,class,pointers,shared-ptr,coredump,C++,Class,Pointers,Shared Ptr,Coredump,这又是一个糟糕的问题,但我不知道如何很快解释这种情况: 我有两节课。让我们把它们命名为A和B。A有很多成员变量和方法。B是一个结构,它有一个指向a类型对象的共享_指针。现在a有一个返回B实例的方法(带有指向a当前实例的指针) 我的问题是,A是C的子类。C的方法与上面描述的纯虚拟方法相同。代码如下所示: class C { public: virtual B mymethod() const =0; virtual int getMyvar() const =0; }; class A

这又是一个糟糕的问题,但我不知道如何很快解释这种情况:

我有两节课。让我们把它们命名为A和B。A有很多成员变量和方法。B是一个结构,它有一个指向a类型对象的共享_指针。现在a有一个返回B实例的方法(带有指向a当前实例的指针)

我的问题是,A是C的子类。C的方法与上面描述的纯虚拟方法相同。代码如下所示:

class C {
public:
  virtual B mymethod() const =0;
  virtual int getMyvar() const =0;
};

class A : public C {
public:
  B mymethod() const override;
  int getMyvar() const override;   //outputs myvar
private:
  int myvar;
};

struct B {
  std::shared_ptr<C> pointer;
};

B A::mymethod() const {
  B instance;
  instance.pointer = std::make_shared<A>(*this);   //is this wrong?
  return instance;
}
std::shared_ptr<A> a_obj(new A);
C类{
公众:
虚拟B mymethod()常量=0;
虚拟int getMyvar()常量=0;
};
A类:公共C类{
公众:
B mymethod()常量重写;
int getMyvar()const override;//输出myvar
私人:
int-myvar;
};
结构B{
std::共享的ptr指针;
};
B A::mymethod()常量{
B实例;
instance.pointer=std::make_shared,但我不知道它是如何工作的,或者它是否对我有帮助


为什么我会收到错误消息?我如何修复此问题?

在我看来,当对象超出范围时,您可能会收到内存错误。 当您创建对象A,然后使用此指针创建共享的\u ptr时,您的计数器将是1而不是2(正如您可能预期的),所以A将被销毁两次,而不是一次。
一种更正确的方法是将类A创建为共享\u ptr,并用它初始化类B中的指针(不在类A内)。这样,计数器将按预期递增,而A将只被删除一次。

在我看来,当对象超出范围时,您可能会出现内存错误。 当您创建对象A,然后使用此指针创建共享的\u ptr时,您的计数器将是1而不是2(正如您可能预期的),所以A将被销毁两次,而不是一次。 一种更正确的方法是将类A创建为共享\u ptr,并用它初始化类B中的指针(不在类A内)。这样计数器将按预期递增,A将只删除一次。

根据我所读的内容,您可以:

与此类似,同一对象的
std::shared_ptr
的所有实例将共享同一个引用计数器,并且只有在必须销毁时才会销毁它

编辑:

另外,请注意,在调用
A::mymethod()
之前,您的对象A必须由其他
std::shared\u ptr
管理。例如,您必须创建如下对象:

class C {
public:
  virtual B mymethod() const =0;
  virtual int getMyvar() const =0;
};

class A : public C {
public:
  B mymethod() const override;
  int getMyvar() const override;   //outputs myvar
private:
  int myvar;
};

struct B {
  std::shared_ptr<C> pointer;
};

B A::mymethod() const {
  B instance;
  instance.pointer = std::make_shared<A>(*this);   //is this wrong?
  return instance;
}
std::shared_ptr<A> a_obj(new A);
编辑2:

方法
A::mymethod()
(因此,
C::mymethod()
)不能是
const
来调用非
const
方法
shared\u from\u this()

根据我所读的内容,您可以:

与此类似,同一对象的
std::shared_ptr
的所有实例将共享同一个引用计数器,并且只有在必须销毁时才会销毁它

编辑:

另外,请注意,在调用
A::mymethod()
之前,您的对象A必须由其他
std::shared\u ptr
管理。例如,您必须创建如下对象:

class C {
public:
  virtual B mymethod() const =0;
  virtual int getMyvar() const =0;
};

class A : public C {
public:
  B mymethod() const override;
  int getMyvar() const override;   //outputs myvar
private:
  int myvar;
};

struct B {
  std::shared_ptr<C> pointer;
};

B A::mymethod() const {
  B instance;
  instance.pointer = std::make_shared<A>(*this);   //is this wrong?
  return instance;
}
std::shared_ptr<A> a_obj(new A);
编辑2:


方法
A::mymethod()
(因此,
C::mymethod()
)不能是
const
,才能调用非
const
方法
shared\u from\u this()

要共享的类需要继承自enable\u share\u from\u this()。 然后您可以从这个调用share\u,以获得指向您所在类的共享指针


如果您只是尝试共享,您只需创建一个单独的所有权组,这将意味着两件事将尝试删除您的对象。这将是您的SEGFULT的原因。

您要共享的类将需要从此继承。 然后您可以从这个调用share\u,以获得指向您所在类的共享指针


如果您只是尝试共享,您只需创建一个单独的所有权组,这意味着有两件事将尝试删除您的对象。这将是您的SEGFULT的原因。

初步问题:如何向下转换以访问myvar?

编辑:编辑后,第一个主题不再相关。我离开它是因为我在演示如何解决它的实时演示中使用了此代码

首先,导致转储的语句无法按照您给定的方式编译:

std::cout << instance.pointer->myvar; 
创建通过复制构造从
*this
获得的克隆对象。因此,您不引用原始对象
a
,因此不需要
std::enable_shared_from_this
:实例的使用计数。指针
将为1,因为此时只有一个引用指向新创建的共享对象ect

还是希望它引用原始对象?

然后,您必须将语句更改为:

instance.pointer = std::shared_ptr<A>(this);   //better ?
C类必须继承如下内容:

class C : public std::enable_shared_from_this<C> 
{...}
C类:公共std::从该
{...}
my method类必须按如下方式初始化它返回的共享_指针:

//instance.pointer = std::shared_ptr<A>(this);    // no, don't do no longer !! 
instance.pointer = shared_from_this();  //<===== RETURN A POINTER TO SELF

//instance.pointer=std::sharedptr

初步问题:如何向下转换以访问myvar?

编辑:编辑后,第一个主题不再相关。我离开它是因为我在演示如何解决它的实时演示中使用了此代码

首先,导致转储的语句无法按照您给定的方式编译:

std::cout << instance.pointer->myvar; 
创建通过复制构造从
*this
获得的克隆对象。因此,您不引用原始对象
a
,因此不需要
std::enable_shared_from_this
:实例的使用计数。指针
将为1,因为此时只有一个引用指向新创建的共享对象ect

还是希望它引用原始对象?

然后,您必须将语句更改为:

instance.pointer = std::shared_ptr<A>(this);   //better ?
C类必须继承