0

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

我有一个带有私有构造函数和 submit() 方法的类,以仔细控制创建的对象,并将创建的每个对象添加到全局列表中。该程序有几个函数可以对全局列表执行“大”操作。现在,它们作为静态函数在对象类中。这似乎是有道理的,因为它们应该在一个类中,并且它们显然与对象相关。但似乎很奇怪,每当我访问一个对象的属性时,Intellisense 也会用这些“大”函数的列表迎接我,虽然这些函数是关联的,但实际上不应该由单个对象调用:它们作用于所有对象的列表!但我想不出另一种方法来做到这一点。我应该有一个名为 Operations 的课程并将它们全部放在里面吗?这似乎太分离了。还,

有任何想法吗?谢谢!

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

4

3 回答 3

2

我建议你有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 的实例构造为全局或单例并根据需要访问它。

于 2009-09-27T23:27:20.433 回答
0

唔。你能做这样的事情吗(从耦合的角度来看)?

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

int main (void)
{
 ProcessObjects(GetGlobalObjects());
 ProcessObjects(somePossibleTemporaryList);
}
于 2009-09-27T23:10:44.463 回答
0

至少据我了解您的描述,我会将这些函数移到类之外,但将类和函数都放在命名空间中。

不过,这个设计听起来有点奇怪——听起来你所拥有的部分是一个对象,但部分表现得像一个对象的集合。如果是这样,那听起来有点像一种令人讨厌的设计气味。

于 2009-09-28T02:12:31.600 回答