如何隐藏单个对象的构造函数和“常规”函数?

时间:2009-09-27 22:59:14

标签: c++ design-patterns structure

我正在寻找有关构建程序的最佳方法的建议。这就是我现在所拥有的,以及我在设计中看到的问题:

我有一个带有私有构造函数和submit()方法的类,用于仔细控制创建的对象,并将创建的每个对象添加到全局列表中。该程序具有多个功能,可以使用全局列表执行“大”操作。现在,它们作为静态函数在对象类中。这似乎是有意义的,因为它们应该在一个类中,并且它们显然与对象有关。但是,每当我访问一个对象的属性时,我都会被Intellisense用这些“大”函数的列表打招呼,这些函数虽然是关联的,但实际上不应该被一个单独的对象调用:它们会作用于所有对象的列表!但我想不出另一种方法。我是否应该有一个名为Operations的类并将它们全部放入其中?这似乎太分散了。另外,这样我仍然会看到submit()方法,我不能从类中删除而不将构造函数声明为public,我不想这样做。

有什么想法吗? 谢谢!

(对不起,我不确定要标记什么,我知道有很多类似的问题,但我已经困惑了一段时间。随意重新标记,编辑,w / e!谢谢再次!)

3 个答案:

答案 0 :(得分:2)

我建议你有两节课:

数据类'Precious',用于保存影响类的单个成员的属性,访问器和操作。

  class Treasure; // let's pre-declare this.

  class Precious {
  private:
    BOOL invisible;
    Precious() : invisible(FALSE) {}
    friend class Treasure. // so it can call the private constructor
  public:
    BOOL isMine() { return TRUE; }
    BOOL iWantsIt() { return TRUE; }
    void don() { invisible = TRUE; }
    ~Precious { printf("need to find mnt/doom here"); exit(1); }
  }

一个集合和管理类'Treasure',包含创建新成员并将其添加到列表的方法,以及管理和执行这些列表操作的方法。

  class Treasure {
    void forgeOne { rings.add( new Precious ); };
    void findThemAll {
      for (Precious* myPrecious;
      {
        // implement remote ring call
      }
    }
    void inTheDarknessBindThem {
      // need to add check for the one ring
      for (Precious* myPrecious;
      {
        // filter on dark rings
        // add binding code.
      }
    }
    Map<Precious*> rings;
  }

然后,您可以构建一个Treasure实例作为全局或单例,并在适当时访问它。

答案 1 :(得分:0)

嗯。你可以做一些这样的事情(从耦合的角度来看)吗?

class Object { };
void ProcessObjects (list<Object *> &objects) { }
list<Object *> &GetGlobalObjects (void);

int main (void)
{
 ProcessObjects(GetGlobalObjects());
 ProcessObjects(somePossibleTemporaryList);
}

答案 2 :(得分:0)

至少在理解你的描述时,我会将这些函数移到类外,但是将类和函数放在命名空间中。

虽然设计听起来有点奇怪 - 听起来你所拥有的部分是一个物体,但也有部分像物体的集合。如果是这样,那听起来有点像一种相当讨厌的设计气味。