标签: visitor

如何确保访客是独一无二的

假设您有一个带有一些在线课程的付费网站.而且你想确保一个人不只是购买访问权限,然后给他所有的朋友提供用户名和密码,这样他们就可以免费开设课程.

你会怎么做?

到目前为止我们的想法:

  • IP跟踪
  • 每个条目的短信密码
  • 每门课程的最大次数

还有其他建议吗?

uniqueidentifier visitor

2
推荐指数
1
解决办法
286
查看次数

是否可以使用ast.NodeVisitor两次访问Python AST中的节点或更改遍历顺序?

NodeVisitor首先遍历AST深度优先,并在输入时仅访问每个节点一次.因此,做一些严肃的事情是有问题的.是否可以更改其默认行为?

python visitor abstract-syntax-tree

2
推荐指数
2
解决办法
1445
查看次数

用C ++转换树

我有一个由不同种类的节点组成的异构n元树,例如:

class Node { }

class Subnode1 : public Node
{

}

class Subnode2 : public Node
{
private:
  unique_ptr<Subnode1> child;

public:
  Subnode1* getChild() { return child.get(); }
}

class Subnode4 : public Subnode2 { }

class Subnode3 : public Node
{
private:
  list<unique_ptr<Subnode2>> children;
public:
  // getter
}

// etc
Run Code Online (Sandbox Code Playgroud)

该结构可以包含任何数量的节点类型,并且将来会进行扩展。

我实现了一种访问树的方法,该方法允许我自定义访问每个节点时的操作,该操作基本上是通过以下方式实现的:

void genericVisit(Node* node) {
  if (dynamic_cast<Subnode2>(node))
    visit(static_cast<Subnode2*>(node));
  // etc
}

virtual void visit(Subnode2* node) {
  if (node->getChild())
    genericVisit(node->getChild());
}

// etc
Run Code Online (Sandbox Code Playgroud)

它能很好地遍历树,但是现在我要求能够用其他子树替换子树,因此我正在考虑遵循的最佳方法,而不会过多地更改结构。

最好的解决方案是让getter直接返回,unique_ptr<Subnode2>&以便我对唯一指针进行访问,并且能够在访问智能指针时更改其内容。这将起作用,但unique_ptr不是多态的,并且无法将调用分派到最专门的方法,例如: …

c++ algorithm tree visitor c++11

2
推荐指数
1
解决办法
524
查看次数

Java访客模式2

以下是我用更好的代码示例提出的问题的后续问题:

以下代码使用访问者模式:

class Animal { void accept(Visitor v) { v.visit(this); } }
class Cat extends Animal {}
class Dog extends Animal {}
class Poodle extends Dog {}

interface Visitor {
    public void visit(Animal a);
    public void visit(Cat a);
    public void visit(Dog a);
    public void visit(Poodle a);
}

class TalkVisitor implements Visitor {
    public void visit(Animal a) { System.out.println("?"); }
    public void visit(Cat a) { System.out.println("Meow"); }
    public void visit(Dog a) { System.out.println("bark"); }
    public void visit(Poodle a) { System.out.println("Arf"); } …
Run Code Online (Sandbox Code Playgroud)

java design-patterns visitor

2
推荐指数
1
解决办法
299
查看次数

QVariant的访客模式(无需手动型式测试和铸造)

Qt的QVariant类是否有任何现有(且方便)的访问者模式实现?

如果没有,是否有可能实现类似的东西boost::apply_visitor(),即最小化测试类型和铸造的重复?

我希望通过以下方式实现目标:

/* I have a QVariant that can contain anything, including user types */
QVariant variant;    

/* But in my Visitor I'm interested only in ints and QStrings (for the sake of the example) */
struct Visitor
{
   void operator()(int i) { /* do something with int */ } 
   void operator()(QString s) { /* ...or QString */ }
};

/* The question is: */
/* Can this be implemented in a generic way (without resorting to …
Run Code Online (Sandbox Code Playgroud)

c++ qt visitor visitor-pattern qvariant

2
推荐指数
1
解决办法
538
查看次数

JavaParser 不更新源文件

我正在使用JavaParser并关注其 Wiki。问题是即使我更改了方法的名称并向其添加了参数,文件也不会更新。换句话说,不会保存更改。当我System.out.println更改时CompilationUnit,它会打印更改,但这些更改根本不会影响源文件。

有什么类似的东西CompilationUnit.update()还是我错过了什么?

我从 Wiki 中使用的示例:

    files_list = FilePicker.chooseAndGetJavaFiles();

    if (files_list == null || files_list.isEmpty()) {
        Errors.showError(Errors.COMMENT_GENERATOR_FILELIST_NULL_OR_EMPTY);
    } else {

        CompilationUnit cu = null;
        FileInputStream in = new FileInputStream(files_list.get(0));
        try {
            cu = JavaParser.parse(in);
        } catch (ParseException ex) {
            Logger.getLogger(CommentGenerator.class.getName()).log(Level.SEVERE, null, ex);
        } finally{
            in.close();
        }
        new MethodChangerVisitor().visit(cu,null);

        System.out.println(cu.toString());
    }
}

private static class MethodChangerVisitor extends VoidVisitorAdapter{

    @Override
    public void visit(MethodDeclaration n, Object arg) {
       // change the name of the method …
Run Code Online (Sandbox Code Playgroud)

java visitor abstract-syntax-tree compilationunit javaparser

1
推荐指数
1
解决办法
1539
查看次数

具有解除引用指针的多态性会产生意想不到的结果......为什么?

我遇到了一个C++难题,可以使用一些帮助!请考虑以下代码:

#include <iostream>

struct Node
{
    virtual void print() 
    {
        std::cout << "Node::print" << std::endl;
    }
};

struct Drawable : public Node
{
    virtual void print() 
    {
        std::cout << "Drawable::print" << std::endl;
    }
};

struct Visitor
{
    virtual void apply(Node& node)
    {
        std::cout << "apply(Node&)" << std::endl;
        node.print();
    }
    virtual void apply(Drawable& drawable) 
    {
        std::cout << "apply(Drawable&)" << std::endl;
        drawable.print();
    }
};

struct Renderer
{
    virtual void accept(Node* node, Visitor* visitor)
    {
        visitor->apply(*node);
    }
};

int main(int argc, char** argv) …
Run Code Online (Sandbox Code Playgroud)

c++ polymorphism visitor

1
推荐指数
1
解决办法
69
查看次数

java中的通用访客模式

以下是使用泛型的访问者模式的java实现,一般是否有用?(我想是的).

它能以某种方式得到改善吗?使用匿名类轻松调用很重要.谢谢.

(使用示例):

Vector<Number> numbers = new Vector<Number>();

        numbers.add(new Double(1.2));
        numbers.add(new Float(-1.2));
        numbers.add(new Double(4.8));
        numbers.add(new Float(-3.4));
        numbers.add(new Long(123456));
        numbers.add(new Short("14"));

        For.each(numbers, new Visitor<Number>() {
            public void doIt(Double n) {
                System.out.println("doIt() for double: " + n);
            }
            public void doIt(Float n) {
                System.out.println("doIt() for float: " + n);
            }
            public void doIt(Number n) {
                System.out.println("doIt() for Number: " + n);
            }
        });

        Visitor<Number> visi =  new Visitor<Number>() {
            private StringBuffer  all = new StringBuffer ();
            public void doIt(Number n) {
                System.out.println("doIt() …
Run Code Online (Sandbox Code Playgroud)

java generics templates visitor

0
推荐指数
1
解决办法
4489
查看次数

boost :: python :: class:以编程方式获取类名

我使用模板化的游标来为几个类定义统一的接口.为了定义__str____repr__方法,我想以编程方式"X"boost::python::class对象中获取类名(在引用文档中).那可能吗?

通过将类名作为参数传递给访问者的构造函数,可以很容易地处理它,但自动拥有它会更优雅.

visitor boost-python

0
推荐指数
1
解决办法
1292
查看次数