面向对象编程设计问题:全局对象第二部分

时间:2009-08-05 09:40:14

标签: c++

很抱歉重新发布此内容,但出于某种原因,我无法为我的旧版本添加评论 帖子。有些人想知道我在尝试时得到的确切错误消息 以下内容:

我可能有一个非常简单的问题,但我找不到合适的问题 设计决定呢。基本上,我有4个不同的继承类和 每个类都有10多种方法。

这些类中的每一个都应该使用相同的TCP Socket;这个 对象在程序执行期间保持套接字对服务器开放。 我的想法是将TCP obejct声明为“全局”以便所有 其他课程可以使用它:

 classTCP TCPSocket;

 class classA
 {
 private:
 public:
 classA();
 virtual void method1();
 ...

 };

class classB
{
 private:
 public:
 classB();
 virtual void method1();
  ...

};
对于classC和classD ......

,等等

不幸的是,在宣布这样的时候,我的Symbian GCC-E编译器给了我这个 以下错误消息

elf2e32:错误:E1027:ELF文件包含初始化的可写数据。

所以我想知道是否还有其他方法可以宣布这一点 TCP对象,以便它可用于所有其他类及其 方法? classA()是第一个被调用的方法 初始化这个子系统。

非常感谢!

4 个答案:

答案 0 :(得分:1)

有一种非常优雅的方式可以按需检索静态实例。

classTCP& SingletonInstance()
{
    static classTCP instance;
    return instance;
}

Idea正在使用c ++功能仅在需要时初始化本地静态变量。

答案 1 :(得分:0)

您可以通过允许classA和classB从同一父级继承来支持类范围的静态成员。

class BaseTCP {
   static classTCP tcp;
   // ...
};

class classA : BaseTCP {
   // ...
};

class classB : BaseTCP {
   // ...
};

现在classA和ClassB共享相同的静态成员。规定是你现在必须在某个地方声明BaseTCP类之外的静态成员,类似于:

classTCP BaseTCP::tcp;

根据您的情况,这可能有点过分......

答案 2 :(得分:0)

为什么不创建一个classTCP实例并将引用传递给其他对象,而不是单独使用单例,为什么它们都拥有对classTCP的单个实例的引用(或指针)。

这提供了一种更加灵活的设计 - 我认为单身人士通常很糟糕并且通常认为使用的限制更多。如果你使用单例,你的类classA,classB等...除了使用单例实例之外别无选择。使用更标准的对象组合设计,您可以释放所有内容。

问自己一些问题,如果我希望应用程序与> 1服务器通信怎么办?或者如果我想为classA编写一些单元测试代码怎么办?当你不需要使用真正的套接字但是可以使用简单地在ram中保存数据块的虚拟代码时,为网络应用程序编写单元测试代码要容易得多。如果你想要一个例子,请添加评论,因为我现在正在吃午饭:)

按照我建议的方式进行操作不会给整体设计增加显着的复杂性,但会使其更加开放。

答案 3 :(得分:-1)