1

我有多个类需要共享另一个类的单个实例。公开地,应该不知道这个类的存在。执行以下操作是否合适?(书面测试)

#include <iostream>

class hideme
{
    private:
        int a;

    public:
        void set(int b) { a = b; }
        void add(int b) { a += b; }
        int get() { return a; }

        hideme() : a(0) { }
};


class HiddenWrapper
{
    protected:
        static hideme A;

};

hideme HiddenWrapper::A;

class addOne : public HiddenWrapper
{
    public:
        void add() { A.add(1); }
        int get() { return A.get(); }
};

class addTwo : public HiddenWrapper
{
    public:
        void add() { A.add(2); }
        int get() { return A.get(); }
};


int main()
{
    addOne a;
    addTwo b;

    std::cout << "Initialized: " << a.get() << std::endl;

    a.add();
    std::cout << "Added one: " << a.get() << std::endl;

    b.add();
    std::cout << "Added two: " << b.get() << std::endl;

    return 0;
}

值得一提的是,它hideme是我正在尝试围绕其设计外观的库的一部分,并且其他类具有库中与 static 交互的成员hideme

另外,如果编写的头文件HiddenWrapper没有相应的源文件,那是定义其静态成员的最佳位置吗?带有一个包含警卫。

有没有其他方法可以解决这个问题?据我所知(不是很远),我只能通过友谊来解决它,我对此很警惕。

4

4 回答 4

0

您可以通过不在使用它的翻译单元之外访问某个类来阻止对它的访问。

// public_header.h

class A {
    void bar();
};
class B {
    void foo();
}

// private_implementation.cpp
#include "public_header.h"

namespace {
  class hidden { void baz() {} };

  hidden h;
}

void A::bar() {
    h.baz();
}
void B::foo() {
    h.baz();
}

这个类只能被 A::bar 和 B::foo 使用。类型hidden和变量h在技术上仍然具有外部链接,但没有其他翻译单元可以说出它们的名字。

于 2012-11-08T23:31:54.820 回答
0

有时通过构造函数(也称为组合而不是继承)注入共享资源(通过引用或指针)是一个更好的主意。这种方式使您能够共享或不共享(例如,拥有不是代码的线程安全变体)。有关详细信息,请参阅http://de.wikipedia.org/wiki/Inversion_of_Control原理。

于 2012-11-08T22:57:08.457 回答
0

这实现了一个围绕其他类的单例并将其对用户隐藏:

class hideme {};

// fwd declarations
class x;

// library internal
class S
{
  S() = delete;
  S(S const&) = delete;
  void operator=(S const&) = delete;
private:
  static hideme& getInstance()
  {
    static hideme instance;
    return instance;
  }

  friend x;
};

// library classes
class x {
  hideme& s;
public:
  x() : s(S::getInstance()) {}
};

int main()
{
  x x;
  return 0;
}

这不处理您实际上希望hideme 实例在没有其他对象不再使用它时被销毁的情况。为此,您需要使用引用计数获得更多创造性。

我还应该说,我认为这是一个坏主意。单身人士几乎总是如此。

于 2012-11-08T23:01:28.740 回答
0

通常,最好的方法是,如果您在主要部分中有一个变量,并且希望与所有类共享它。
例如,如果类 X 对此 var 进行了更改,则更改也发生在 main 中的 var 上:您可以使用EXTEND
********************* *** 主要的 *********************

#include <iostream>
using namespace std;

#include "Game.hpp"
//0: not specified yet; 1:singlemode; 2:multiplayerMode
int playingMode = 0;

int main()
{
    Game game;
    game.Run();
    std::cout<< playingMode << std::endl; 
    return 0;
}  

*********************** X 级 *****************

#include <iostream>
using namespace std;

extern int playingMode;

....
....

if(m_isSinglePressed)
    {
        playingMode = 1;
        ...

    }
    else if(m_isMultiPressed)
    {
        playingMode = 2;
        ...
    }
于 2020-12-05T18:18:22.480 回答