C ++类指针的动机

时间:2013-09-01 10:10:13

标签: c++ class pointers

我是C ++的新手,我对C和不同的动态脚本语言有一点经验,比如JavaScript,PHP和一些Ruby和Python。我已经使用面向对象(OO)原则工作,即使不是很长时间,但对我来说,新的事情是C ++确实使用了指向类的指针。 C中的指针对我来说不再是一个谜(至少我希望如此)如果我做对了 - 除非你没有别的选择,否则永远不要使用指针。例外情况是,如果要跟踪特殊变量,或者想要将其传递给函数以更改其值。因为我必须有动力使用指针,我可以在C ++中使用它们。你能参考一个例子吗?我在维基百科上学习过。它是C ++中Builder Design Pattern的一个例子。他们使用Pizza类和PizzaBuilder,它使用指向m_pizza类的Pizza指针。在这里使用指针而不是普通实例的原因是什么?

修改

只是为了避免误解

  • 我的意思是什么意思:“C中的指针对我来说不再是一个谜”,是我知道它们是如何存储在内存等中的。这并不意味着我是一个C-ninja :)

  • 当我说:“我已经工作了,即使不是很长时间,以面向对象(OO)原则”,我的意思不是很长时间,如果不是很有经验,但我乍看之下,我只使用高级脚本语言,除了C和C没有类之外,没有任何其他低级语言的经验。 :)

2 个答案:

答案 0 :(得分:3)

他们在这个例子中使用指针的原因是它是一个抽象工厂。 其目的是从不同的披萨类中构建披萨对象。

抽象工厂需要保存这些对象而不知道它们在内存中占用了多少空间。这就是为什么你不能在这里使用普通实例作为成员变量。它们的大小因披萨制造商的每个实施而不同。

嗯,我认为这就是这里的想法。在这个例子中,他们总是使用相同的比萨类,但你可以通过从基础比萨饼中获得一个可以生产具有完全不同特征的比萨饼的工厂。然后你需要在抽象披萨生成器中使用指针来抓住披萨。

答案 1 :(得分:1)

constructPizza()方法中的 m_pizza = new Pizza; 行分配内存并使指针成员变量“m_pizza”指向它。通过使用getPizza(),您将获得指向对象的已分配内存的指针。

除此之外,创建的每个构建器对象都有自己的Pizza指针成员变量。因此,在main中,每次getPizza()调用后, hawaiian spicy 指向的Pizza对象都是不同的对象。

另外,请注意,如果我们在某处有2个相同构建器实例createNewPizzaProduct()的后续调用,则会创建2个对象,但只有最后一个内存将被设置为由成员变量指针指向,从而导致内存泄漏。 (例如,如果m_pizzaBuilder-> createNewPizzaProduct();在Cook的constructPizza()方法中被错误地调用了2次,可能会发生这种情况。我的观点是这里的代码可能更安全,但是它似乎没有任何泄漏的方式都是如此)。