C++ 将堆栈对象作为指针注入类后重新创建堆栈对象是否不好? //示例程序 #包括 福班{ 公众: Foo(inta):a(a){} 作废打印(){ printf(“%d\n”,a); } 私人: INTA; }; 分类栏{ 公众: 酒吧(Foo*Foo):Foo(Foo){} 作废打印(){ foo->print(); } 私人: Foo*Foo; }; int main() { Foo f={10}; 酒吧b&f; b、 打印(); f={20}; b、 打印(); }

C++ 将堆栈对象作为指针注入类后重新创建堆栈对象是否不好? //示例程序 #包括 福班{ 公众: Foo(inta):a(a){} 作废打印(){ printf(“%d\n”,a); } 私人: INTA; }; 分类栏{ 公众: 酒吧(Foo*Foo):Foo(Foo){} 作废打印(){ foo->print(); } 私人: Foo*Foo; }; int main() { Foo f={10}; 酒吧b&f; b、 打印(); f={20}; b、 打印(); },c++,oop,pointers,C++,Oop,Pointers,在上面的代码中,可以在Bar不知道的情况下重新创建与Bar对象共享的Foo对象。 假设我必须将bar对象注入到第三个类中。现在我可以更新foo依赖项,而不必创建bar和第三个类的新对象 这个模式是否常用?它是否违反了OOP的一些原则?我不认为代码做了您认为它做的事情。 我已经向Foo类添加了默认构造函数和assign/operators,并进行了一些日志记录,看看会发生什么。除非显式禁用这些构造函数,否则编译器会自动添加这些构造函数。查看输出 发生了什么 f = {20}; 就是构造一个不同的

在上面的代码中,可以在Bar不知道的情况下重新创建与Bar对象共享的Foo对象。 假设我必须将bar对象注入到第三个类中。现在我可以更新foo依赖项,而不必创建bar和第三个类的新对象


这个模式是否常用?它是否违反了OOP的一些原则?

我不认为代码做了您认为它做的事情。 我已经向Foo类添加了默认构造函数和assign/operators,并进行了一些日志记录,看看会发生什么。除非显式禁用这些构造函数,否则编译器会自动添加这些构造函数。查看输出

发生了什么

f = {20};
就是构造一个不同的Foo对象,然后移动并将其分配给原始实例

在这种情况下,它相当于

f.a = 20;  // Assuming we make a public.
总之。 如果只是更改现有实例中的字段(在本例中通过assign运算符)。那么一切都会好起来的。这不一定会使OOP原则失效,除非您假设Bar.foo是常量或不变。这通常被称为组合,并且非常常见(您的UI将包含各种按钮实例,这些实例可能会从其他来源进行修改)

如果您希望更改实现(假设Foo是一个虚拟类,并且您希望替换一个不同的派生),那么在您的代码中需要有
Foo*f=newfoo(10)。您将在
b
中拥有指针的副本,作业将创建一个新类,该类不会在
b
中更新(类似于
f=new FooDerived(20);

要使其正常工作,您需要一个提供程序类(这是一个OOP模式)。这将为您提供一个
Foo
。最简单的是
Foo**
。但最好有一些更可定制的东西

也就是说,对于任何严肃的工作,尽量远离裸露的指针(
Foo*
)。适当地使用独特的或共享的指针,以避免将来出现很多问题

这个模式是否常用?它是否违反了OOP的一些原则

我要说的是,这种结构应该谨慎使用

实际上,在
Bar
中,您只是复制指针值。但是如果在堆栈上创建的给定
Foo
超出范围,则
Bar
正在存储一个悬空指针

试图取消对悬空指针的引用是未定义的行为

将堆栈对象作为指针注入类后重新创建堆栈对象是否不好

实际上,正如@DanielLangr所述,您没有“重新创建”对象,您只是重新分配了它的内容,因此对象的生命周期没有结束。
对你来说,你仍然很好

这个模式是否常用?它是否违反了OOP的一些原则

是的,这是很常见的,在你的例子中也不错

您必须小心确保
f
b
的整个生命周期内保持活动状态,在您的示例中就是这种情况。如果要复制
b
,您还需要确保副本不超过
f


函数
func
的局部变量的优点在于,它们比
func
调用的函数的任何局部变量都活得长。因此
main
的局部变量活了(几乎)在整个程序中,只有全局变量比它们更有效。

将指针传递给驻留在堆栈上的对象很少是个好主意。除此之外,您可以实现setter来更新Foo*in Bar。但是您的用例是什么?了解更广泛的范围肯定有助于建议合适的模式。您所说的可以重新创建是什么意思?复制/移动赋值运算符不会“重新创建”对象。@ypnos向堆栈上的对象传递指针有什么不对?只要没有人对其调用
delete
(无论如何都不应该这样)我看不出问题。没有经验的人会在堆栈上创建一个对象,传递它的指针,然后将其放入容器中。或者当对象超出范围时保留指针的对象。诸如此类的事情。我并不是说如果你知道你在做什么,你就永远不会做这些事情。我经常遇到这样的情况,我有一个Qt Q*thing在堆栈上,但Qt方法需要一个指针。为什么要向下投票?我很高兴知道我错过了什么:)对不起,我没有看到问题。我不认为这是坏习惯。当然,当其他人正在使用该对象时,你必须注意该对象是否仍然存在,但除此之外,它有什么问题吗?@Formerlyknownas463035818同意,我将修改我所写的内容。这应该是一个“警告”而不是“这很糟糕”。@formerlyknownas_463035818谢谢你的解释,顺便指出了这一点。更正。