0

我是一名拥有 7 年经验的 Java 开发人员,但我对 C++ 几乎完全陌生。这不是家庭作业,甚至不是真正的有偿工作。我只是深入研究 C++,在模拟我在 Java 中经常使用的一种特定模式时遇到了麻烦。

基本上(在Java中):

    public class ExampleManager
    { 
       private static Example _example;

       public static Example getExample()
       { 
          return _example;
       }

       public static void setExample(Example example)
       {
          _example = example;
       }
    } 

到目前为止,我已经尝试了四种关于 C++ 的变体。我发现使用相同语法传递“示例”可以让我获得存储在类中的“示例”副本。我了解指针背后的大部分逻辑,但不是很多细节。这个例子对我有很大帮助。

如果有人可以给我等效的 C++ 代码,以便我可以逐行分解并逐步完成它,我将非常感激。

我没有像在 Java 中那样使用这种模式,但它是我用来维护对单个实例成员的线程安全访问的模式的核心。

4

1 回答 1

3

C++ 中基本等效的代码是这样的:

class ExampleManager
{ 
private:
   static std::shared_ptr<Example> _example;

public:
   static std::shared_ptr<Example> getExample()
   { 
      return _example;
   }

   static void setExample(std::shared_ptr<Example> example)
   {
      _example = example;
   }
};

它利用了std::shared_ptr类,它为您完成了大部分内存处理工作(您只需要new对象,基本上就像在 Java 中一样)。

我们在这里不使用“原始”指针(即Example *);通常不赞成使用“原始”指针(除非您在资源有限或接近硬件的环境中工作),因为它在性能方面几乎没有收益,但会导致丑陋的问题(内存泄漏、双重删除) , ...) 如果不仔细考虑。

请注意,shared_ptr上面使用的只是 C++11 以来标准的一部分。大多数最近的编译器已经接受了它的用法,如上所示;对于一些年龄较大的人,您可能需要做一些特殊的事情:

  • 例如对于 g++ <= 4.6,添加-std=c++0x到编译命令行
  • 对于一些你可能不得不使用std::tr1::shared_ptr
  • 如果上述两个选项都失败了,您可以使用boost 库中的boost::shared_ptr
于 2013-09-30T06:44:42.403 回答