Oppen's algorithm을 C++로 구현하려고합니다.C++ 스마트 포인터가있는 방문자 패턴
이 알고리즘 (인쇄 및 스캔)의 기본 루틴은 토큰 유형으로 발송됩니다. 방문자 패턴을 사용하여이 디스패치를 구현하는 것이 자연스러운 것처럼 보입니다. 문제는 다음과 같습니다. 루틴이 중첩되어 print()에 대한 인수가 scan() 중에 스택에 대기열에 포함됩니다. 메모리 문제를 피하기 위해 작업에 스마트 포인터를 사용하고 싶습니다.
그래서 내 구현은 다음과 같습니다 : 당신이 볼 수 있듯이, 열기 토큰이 어떤 데이터를 전송하지 않고 쉽게 위치에 구성 할 수
class Text;
class Line;
class Open;
class Close;
class Visitor {
/* Define virtual visit functions for concrete doc nodes:
*/
public:
virtual void visit(const Text&) = 0;
virtual void visit(const Line&) = 0;
virtual void visit(const Open&) = 0;
virtual void visit(const Close&) = 0;
};
class DocToken
{
protected:
explicit DocToken() {}
friend class Visitor;
public:
virtual void accept(Visitor * visitor) const = 0;
};
class Text : public DocToken {
public:
Text(std::string s) : text(s) {}
void accept(Visitor *visitor) const {
visitor -> visit (*this);
}
std::string text;
};
class Open : public DocToken { /* .. */ }
/* .. */
class Scan : public Visitor {
stream_t stream;
/* ... */
public:
void visit(const Open& x) {
/* ... */
stream.push_back(/* .. */ new Open() /* .. */);
/* ... */
}
void visit(const Text& x) {
/* ... */
stream.push_back(/* .. */ new Text(x) /* .. */);
/* ... */
}
/* .. */
}
. 텍스트 토큰은 데이터 (std :: string)를 전달하므로 스트림으로 푸시 (push)되도록 복사해야합니다. 스트림은 Open 및 Text의 공통 추상 기본 클래스로 인해 포인터로 구성되어야합니다.
바깥쪽에는 텍스트 토큰에 대한 스마트 포인터가 있기 때문에 복사를 피하고 단순히 기존 스마트 포인터를 사용하고 싶습니다. 그러나 accept 메서드는 해당 스마트 포인터에 액세스 할 수 없습니다.
스마트 포인터에 직접 방문자 패턴을 구현할 수있는 방법이 있습니까? 그렇지 않은 경우 어떻게 텍스트 토큰을 복사하는 비용을 줄일 수 있습니까?
'Visitor'의 당신의 정의는 무엇입니까? (또한 문제가 있음을 보여주기 위해 프로필을 작성하기 전에는 복사에 대해 너무 걱정하지 않아도됩니다.) –
구현을 추가했습니다. 고전적인 방문자 패턴, AFAIK. 그리고 네, 최적화는 가치가 없을 수도 있지만, 그렇다면 제대로 수행하는 방법을 알지 못합니다. 그래서 묻습니다;) – choeger
"바깥쪽에는 해당 텍스트 토큰에 대한 스마트 포인터가 있습니다."토큰의 각 *을 shared_ptr에 저장 하시겠습니까? 즉, (기본 클래스에) 공유 포인터의 범위가 있습니까, 당신은 그들 모두에게 방문자를 전달합니까? –