2009-08-05 2 views
1

죄송합니다. 이유는 무엇입니까? 그러나 이전 게시물에 댓글을 추가 할 수 없습니다. 어떤 사람들은 내가하려고 할 때 정확한 오류 메시지를 알고 싶었습니다.OO 프로그래밍 설계 질문 : 글로벌 객체 파트 II

저는 꽤 간단한 문제가 있었지만 적절한 디자인 결정을 아직 ​​찾지 못했습니다. 기본적으로 4 가지 상속 클래스가 있으며 클래스에는 각각 10 가지가 넘는 메서드가 있습니다.

각 클래스는 동일한 TCP 소켓을 사용해야합니다. 이 객체는 프로그램 실행 중에 소켓을 서버에 대해 열린 상태로 유지합니다. 내 생각은 "글로벌"로 선언 obejct은 TCP를 가지고 있었다 모든 다른 클래스를 사용할 수 있도록 :

classC 및 classD에 대한 등등
classTCP TCPSocket; 

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

}; 

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

}; 

및 ... 불행하게도

, 때를 선언 이 내 심비안 GCC-E 컴파일러 내게 다음 오류 메시지를 제공합니다

elf2e32 : 오류 : E1027 : ELF 파일에 초기화 된 쓰기 가능한 데이터가 있습니다.

그래서 다른 모든 클래스 및 해당 메서드를 사용할 수 있도록이 TCP 개체를 선언 할 수있는 다른 방법이 궁금 무엇입니까? classA()는 이 서브 시스템을 초기화 할 때 호출되는 첫 번째 메소드입니다.

감사합니다.

+0

댓글을 작성할 대표자가 충분하지 않지만 언제든지 질문을 편집 할 수 있습니다.이 경우해야 할 일입니다. –

+0

유감스럽게도 먼저 그 계정을 확보해야합니다. 손님으로 게시하면 다른 컴퓨터에서 편집 할 수 없습니다. –

답변

-1
+0

기본적으로 스레드로부터 안전하지는 않습니다. – nagul

+0

그리고 재미있는 부작용으로 인해 하나 이상의 소켓을 만들지 못하게되어 그에게 관심이 있는지 의심 스럽습니다. "싱글 톤은 전역을 대체 할 드롭 인이 아닙니다." – jalf

+0

@jalf : 귀하의 요지를 잘 모르겠습니다. 싱글 톤은 둘 이상의 객체를 갖는 것을 막지 않습니다. 예를 들어 SocketManager.createNewSocket() ... –

1

필요에 따라 정적 인스턴스를 검색하는 매우 우아한 방법이 있습니다.

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

아이디어는 필요시에만 로컬 정적 변수를 초기화하기 위해 C++ 기능을 사용합니다.

+0

과 관련하여 알아 두어야 할 유일한 문제는 함수가 처음 호출 될 때 발생할 수있는 경쟁 조건이며 두 스레드가 동시에 classTCP를 초기화하려고합니다. – jalf

+0

휘발성 키워드를 사용하는 데 문제가 없습니다. – Dewfy

0

classA와 classB가 동일한 부모로부터 상속하도록 허용하여 클래스 전체 정적 멤버를 지원할 수 있습니다.

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

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

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

이제 classA와 ClassB는 동일한 정적 멤버를 공유합니다. 약정, 당신은 지금 BaseTCP 클래스 곳의 외부 정적 멤버를 선언해야한다는 유사합니다 ... 상황에 따라,이 과잉 될 수있다

classTCP BaseTCP::tcp; 

대신 싱글 톤을 사용
0

, classTCP 인스턴스를 만들고 다른 객체에 대한 참조를 전달하면됩니다. 각 객체는 classTCP의 단일 인스턴스에 대한 참조 (또는 포인터)를 소유하고 있습니다.

이것은 훨씬 더 유연한 디자인을 제공합니다 .- 나는 싱글 톤이 일반적으로 빨기도하고 일반적으로 믿는 훨씬 제한된 사용을한다고 생각합니다. 싱글 톤을 사용한다면 classA, classB 등의 클래스에는 옵션이 없으며 싱글 톤 인스턴스를 사용합니다. 보다 표준적인 오브젝트 컴포지션 디자인을 사용하면 모든 것을 해제 할 수 있습니다.

같은 질문을하십시오. 응용 프로그램이> 1 서버와 대화하고 싶다면 어떻게해야합니까?또는 classA에 대한 단위 테스트 코드를 작성하고 싶습니다. 실제 소켓을 사용할 필요가 없지만 램에 데이터 덩어리를 단순히 보관하는 더미 (dummy) 코드를 사용할 수있는 경우 네트워킹 응용 프로그램 용 단위 테스트 코드를 작성하는 것이 훨씬 쉽습니다. 점심을 먹기 때문에 예제를 원한다면 코멘트를 추가하십시오 :)

그런 식으로하는 것은 전체적인 디자인에 상당한 복잡성을주지는 않지만 훨씬 더 개방적이게 만듭니다.