C++ c++;如何在另一个类中获取指向当前对象的指针?
这又是一个糟糕的问题,但我不知道如何很快解释这种情况: 我有两节课。让我们把它们命名为A和B。A有很多成员变量和方法。B是一个结构,它有一个指向a类型对象的共享_指针。现在a有一个返回B实例的方法(带有指向a当前实例的指针) 我的问题是,A是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
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类必须继承