草庐IT

$C指针

全部标签

c++ - 智能指针与值作为成员变量

我有一个类A,它具有M和N类型的成员变量。这些对象的生命周期应该受A的生命周期限制。我在考虑classA{Mmember1;Nmember2;}对比classA{std::unique_ptrmember1;std::unique_ptrmember2;}我不完全确定哪个更好,因为它们都能实现我想要的。成员的生命周期与对象绑定(bind),我不需要手动管理内存。每种设置的优点和缺点是什么? 最佳答案 如果使用std::unique_ptrM和N是多态层次结构的基类member1和member2是可选成员,可以是nullptrM和N足

c++ - C++中的函数指针歧义

我有两个问题:Q1)函数名本身是指针吗??如果它们是指针,那么它们存储的是什么值?否则如果它们不是指针,那么,它们是什么以及其中存储了哪些值?如果我们认为函数名是指针。然后:voiddisplay(){...}intmain(){void(*p)();**p=display;//Works(justified**,becauseweareassigningonepointerintoanother)**p=&display;//Works(Notjustified**Iffunctionnameisapointer(letsaytype*),then&displayisofdataty

c++ - 为什么在传递 lambda 而不是函数指针时无法推断模板参数

我有一个冒泡排序函数,它接受一个数组、一个比较函数和一个指示是否应该对数组进行倒序排序的bool值。它是一个模板函数,支持任何数据类型,并会自动推导数组大小。当指定比较函数时,如果我传递函数指针,编译器会自动推导出数组的数据类型,这很棒。但是如果我改为传递lambda,它不会自动推导。我必须明确指定数据类型,或者static_castlambda为fnCompare_t.这背后的原因是什么?因为根据thispost,只要lambda不捕获,它就可以像普通的函数指针一样使用,但似乎并非总是如此?为什么在这种情况下会有所不同?#includeusingnamespacestd;templa

c++ - 将 "this"转换为引用指针

假设我有一个结构structFoo{voidbar(){do_baz(this);}/*Seeeditbelowvoiddo_baz(Foo*&pFoo){pFoo->p_sub_foo=newFoo;//forexample}*/Foo*p_sub_foo;}GCC告诉我temp.cpp:Inmemberfunction‘voidFoo::bar()’:temp.cpp:3:error:nomatchingfunctionforcallto‘Foo::do_baz(Foo*const)’temp.cpp:5:note:candidatesare:voidFoo::do_baz(Foo

c++ - 派生的 C++ 类如何通过基指针克隆自身?

这是我正在尝试做的(这段代码不起作用):classBase{virtualBase*clone(){returnnewBase(this);}virtualvoidID(){printf("BASE");};classDerived:publcBase{virtualBase*clone(){returnnewDerived(this);}virtualvoidID(){printf("DERIVED");}}..Derivedd;Base*bp=&d;Base*bp2=bp->clone();bp2->ID();我喜欢的是看到打印出“DERIVED”...我得到的是“BASE”。我是

c++ - 静态变量指针?

这是非法/危险的吗?int*static_nonew(){staticintn=5;return&n;}编译器似乎没有问题,但是指针位置本身是否受到保护,不会在其他人需要内存时被覆盖?编辑:更多解释我为什么问这个问题。注意:我正在用C++编程,我只是将它标记为C,因为它似乎更像是C而不是C++问题。我有一个应该返回静态map的类。我只希望在整个程序中初始化此map一次,因为似乎不需要多次执行此操作。出于这个原因,我打算做这样的事情:staticstd::maptransitions;staticTransitiontrans1(transitions,...);staticTransi

c++ - 如何在 C++ 中将局部变量转换为指针?

我有一个对象变量:Foox;我需要调用一个需要Foo*的函数。如何从Foo转换为Foo*。我知道这行不通:Foo*y=&x;o->setFoo(y);因为“x”是一个局部变量,所以它会被销毁,我给的指针将指向任何东西。我该怎么做?注意:我不能修改变量a的函数或类型! 最佳答案 如果定义了合适的拷贝构造函数,o->setFoo(newFoo(x));但是o的析构函数应该删除x(如果setFoo已经设置,它可能也应该删除)。注意:定义一个析构函数是不够的。还需要定义复制构造函数/赋值运算符,并且:应该被禁用或了解他们指向的内容并执行深拷

c++ - 是否可以创建指向函数的 `new` 运算符/构造函数的函数指针?

如果我想要参数化创建一个对象,我当然可以创建一个在特定类上调用new并传递指针的函数。我想知道是否可以跳过该步骤并将函数指针传递给new运算符本身。 最佳答案 boost::lambda提供functionwrappersfornewanddelete.这些可用于轻松地将new调用转换为函数对象。 关于c++-是否可以创建指向函数的`new`运算符/构造函数的函数指针?,我们在StackOverflow上找到一个类似的问题: https://stackover

c++ - 为什么我不能将指向 Derived 类成员函数的指针强制转换为相同但属于 Base 类的成员函数?

对我来说,将void(Derived::*)()转换为void(Base::*)()看起来非常安全,如下所示代码:#include#includeusingnamespacestd;structBase{void(Base::*any_method)();voidcall_it(){(this->*any_method)();}};structDerived:publicBase{voida_method(){cout但是编译器在a.any_method=&Derived::a_method;处提示转换。这是防止细微编程错误的障碍,还是只是为了让编译器编写者的生活更轻松?是否有变通方法

c++ - 使用其指针从列表中删除项目

我有一个指针p(不是迭代器)指向列表中的一个项目。然后我可以使用p从列表中删除(删除)该项目吗?像这样的东西:mylist.erase(p);到目前为止,我只能通过遍历列表直到到达位置p处的项目,然后使用erase方法来完成此操作,该方法看起来效率很低。 最佳答案 不,您必须使用迭代器。我不明白为什么获取指针比获取迭代器更容易... 关于c++-使用其指针从列表中删除项目,我们在StackOverflow上找到一个类似的问题: https://stackove