2011-01-20 5 views
-1

그래서 이런의 int 또는 상수 뭔가 같은 간단한 데이터 ++ С에 대한 * 문자를 시스템 가입과 같은 이벤트가

#include <iostream> 
#include <vector> 

using namespace std ; 

typedef void FuncInt (int) ; 

class GraphElementProto { 
public: 
    void add (FuncInt* f) 
{ 
    FuncVec.push_back (f) ; 
} ; 
    void call() 
{ 
    for (size_t i = 0 ; i < FuncVec.size() ; i++) 
    FuncVec[i] (i) ; 
} ; 
private: 
    vector<FuncInt*> FuncVec ; 
} ; 


static void f0 (int i) { cout << "f0(" << i << ")" << endl ; } 
static void f1 (int i) { cout << "f1(" << i << ")" << endl ; } 

int main() { 
    GraphElementProto a ; 
    a.add (f0) ; 
    a.add (f1) ; 
    a.call() ; 
} 

그래서 지금 우리는 문자 같은 일부 데이터 버퍼 작업을 상상 일 것이기 만들기.

우리는 데이터 포인터를 기다리는 스레드가 있으며 포인터가 데이터를 동시에 변경하려고하는 것처럼 보입니다. 따라서 우리는 그 데이터의 복사본을 생성하고 각 가입자 포인터에 자신의 사본을 제공해야합니다.

그런 일을하는 방법? (죄송합니다 C + +의 누브 - 코드는 내가 이해할 수있는 유일한 것입니다)

+2

저는 C++ nube가 아니지만 귀하의 질문을 귀하의 질문보다 훨씬 잘 이해합니다. 정교하게하십시오 –

+0

나는 질문을 편집했다 - 지금 그것은 더 좋을 것이다.) – Rella

+0

나는 당신이 묻고 싶어하는 것을 아직도하고있다라고 말해야한다/거기에서해라. 동일한 데이터에 쓰려고하는 여러 스레드가 있다면 거기에서 문제가 발생하지 않을 것입니다.하지만 아무 것도 수정하지 않으면 데이터를 수정하는 시점이 무엇인지 나중에 다시 병합하는 방법을 고려해야합니다. 하지만 C++을 처음 접한다면, 쓰레드를 사용해야합니까? C++은 충분히 어렵 기 때문에 스레딩은 완전히 새로운 두통을 불러옵니다. – Grizzly

답변

2

당신이 설명하는 그래프의 각 노드 사이의 유사점 (아래의 클래스 GraphElement)을 고려하십시오. 자식 노드와의 관계를 캡슐화해야하며 들어오는 메시지 (localAction 함수)를 사용하여 로컬로 처리해야합니다. 그런 다음 특정 변형을 나타내는 클래스 (예 : 언급 한 이미지 생성기)를 가져와 로컬 작업을 변경해야합니다. 각 클래스는 원본 메시지의 복사본을 가져 오거나 필요에 따라 변경할 수 있습니다.

여기 예제 코드에서는 GraphNode라는 기본 그래프 노드를 만들고 자식 노드에 전달하기 전에 들어오는 메시지를 인쇄하도록 만들었습니다. 들어오는 메시지에 문자열 개체를 사용했습니다. 일반 old C char * 배열보다 훨씬 좋았습니다. [예 : message2가 아래 코드에서 만들어지면 char *에서 문자열을 파생시킬 수 있습니다.] 나는 객체의 const 참조를 싸고 빠르며 원래의 것을 결코 변경하지 않는다.

필자는 필요한 변형의 예로 CatNode라는 클래스를 파생 시켰습니다. 이 유형의 객체는 모든 메시지의 히스토리를 포함하고 새로운 메시지가 도착할 때 히스토리를 출력합니다. 그다지 유용한 것은 아니지만 좋은 예는 그다지 많지 않습니다. 이것은 각 노드가 원본 메시지의 복사본에 대해 무엇을 할 수 있는지를 보여줍니다. 즉, localAction()을 다시 작성합니다. 또한 해당 기록을 자식 노드에 전달합니다. 전달 메시지 매개 변수가 전달 된 메시지에 대해 deliveryMessage()에 전달 된 변경 사항으로 다시 작성합니다.

#include <vector> 
#include <iostream> 
#include <string> 
using std::cout; 
using std::endl; 
using std::vector; 
using std::string; 

class GraphNode 
{ 
public: 

    GraphNode(string & name) : mChildren(), mName(name) {} 
    GraphNode(const char * const name) : mChildren(), mName(name==NULL?"":name) {} 

    virtual void incomingMessage(const string & str) { 
    localAction(str);  // This node is to do something. 
    deliverMessage(str); // Child nodes are to do things too. 
    } 

    void addChild(GraphNode * child) { 
    mChildren.push_back(child); 
    } 

protected: 

    // Rewrite this function for child classes who are to do different things with messages. 
    virtual void localAction(const string & str) { 
    cout << mName << " : " << str << endl; 
    } 

    void deliverMessage(const string & str) { 
    vector<GraphNode*>::iterator itr = mChildren.begin(); 
    for(; itr != mChildren.end(); ++itr) 
     (*itr)->incomingMessage(str); 
    } 

    // Data members 
    vector<GraphNode*> mChildren; 
    string mName; 

}; // [ GraphNode ] 



class CatNode : public GraphNode 
{ 
public: 

    CatNode(string & name) : GraphNode(name), mHistory() {} 
    CatNode(const char * const name) : GraphNode(name), mHistory() {} 

    virtual void incomingMessage(const string & str) { 
    localAction(str); 
    deliverMessage(mHistory); 
    } 

protected: 

    virtual void localAction(const string & str) { 
    mHistory += str; 
    cout << mName << " : " << mHistory << endl; 
    } 

    // Data members 
    string mHistory; 

}; // [ CatNode ] 



main() 
{ 
    // root -> childA 
    GraphNode root("Root Node"); 
    CatNode childA("Child A"); 
    root.addChild(&childA); 
    root.incomingMessage("Message1"); 
    cout << endl; 

    // root -> childA -> childC 
    //  \-> childB 
    GraphNode childB("Child B"); 
    root.addChild(&childB); 
    GraphNode childC("Child C"); 
    childA.addChild(&childC); 
    string message2("Message2"); 
    root.incomingMessage(message2); 

} // [ main ] 
+0

수정 된 질문. 희망은 이제 더 명확. – Rella

+0

충분히 공정합니다. 개체의 편집 가능한 복사본이 필요합니다. 내 대답이 당신의 요구 사항을 충족시키지 못합니다. @ Kabumbus – youngthing

+0

그래서 ... 당신의 창살 게시물에 조금 upvoted ... 그래서 당신이 게시물을 편집 할 수 있기를 바랍니다 ... 당신은 어떤 게시물 업데이 트를 제공 할 수 있습니까?) – Rella

관련 문제