很抱歉重新发布此内容,但出于某种原因,我无法为我的旧版本添加评论 帖子。有些人想知道我在尝试时得到的确切错误消息 以下内容:
我可能有一个非常简单的问题,但我找不到合适的问题 设计决定呢。基本上,我有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()是第一个被调用的方法 初始化这个子系统。
非常感谢!
答案 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)