1

我是 C++ 新手,我对 C 和不同的动态脚本语言(例如 JavaScript、PHP 和一点 Ruby 和 Python)有一点经验。我一直在使用面向对象 (OO) 原则,即使时间不长,但对我来说新的是 C++ 确实使用指向类的指针。C 中的指针对我来说不再是一个谜(至少我希望如此),如果我做对了——除非你别无选择,否则永远不要使用指针。如果您想跟踪一个特殊变量,或者如果您想将它传递给一个函数以更改其值,则例外情况。而且由于我必须有使用指针的动机,我必须在 C++ 中使用它们。你能参考一个例子吗?我在维基百科上研究过。它是C++ 中构建器设计模式的一个示例。他们使用Pizza类和PizzaBuilder,它使用m_pizza指向Pizza类的指针。在这里使用指针而不是普通实例的原因是什么?

编辑:

只是为了避免误解

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

  • 当我说:“我已经使用面向对象 (OO) 原则工作了,即使时间不长”,我的意思是,如果不是很有经验,但我第一眼就明白了,而且我只使用过高级脚本语言,没有任何其他低级语言的经验,除了 C 和 C 没有类。:)

4

2 回答 2

3

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

抽象工厂需要在不知道它们在内存中占用多少空间的情况下保存这些对象。这就是为什么你不能在这里使用普通实例作为成员变量的原因。它们的大小会随着比萨构建器的每个实现而不同。

好吧,我认为这就是这里的想法。在这个例子中,他们总是对比萨使用相同的类,但是你可以实现一个工厂,通过从基础比萨派生来生产具有完全不同特征的比萨。然后你需要在抽象比萨生成器中的一个指针来保存比萨。

于 2013-09-01T11:23:47.853 回答
1

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

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

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

于 2013-09-01T13:42:37.057 回答