【问题标题】:Simple Java code, having trouble creating a C++ equivalent (private static members and public accessor methods)简单的 Java 代码,无法创建 C++ 等效项(私有静态成员和公共访问器方法)
【发布时间】:2013-10-05 22:37:27
【问题描述】:

我是一名拥有 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 中那样使用这种模式,但它是我用来维护对单个实例成员的线程安全访问的模式的核心。

【问题讨论】:

    标签: java c++ static pass-by-reference


    【解决方案1】:

    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++ -std=c++0x 添加到编译命令行
    • 对于某些您可能必须使用std::tr1::shared_ptr
    • 如果以上两个选项都失败,您可以使用 boost 库中的 boost::shared_ptr

    【讨论】:

    • 谢谢。这正是我一直在寻找的答案。显然我需要等待 15 分钟才能接受它。 :-) 我现在也将研究 shared_ptr 的细节。感谢您的编辑。
    • @juanchopanza 我确实注意到可访问性修饰符是 Java 风格的。但这是微不足道的。
    • @ScottDrew 对。但请注意,public 类是一个在 C++ 中并不真正存在的概念。
    • 这属于可访问性修饰符,不是吗?感谢您的输入,尽管我从原始答案中发现了我需要的东西。 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-28
    • 1970-01-01
    • 1970-01-01
    • 2011-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多