假设您有一个带有一些在线课程的付费网站.而且你想确保一个人不只是购买访问权限,然后给他所有的朋友提供用户名和密码,这样他们就可以免费开设课程.
你会怎么做?
到目前为止我们的想法:
还有其他建议吗?
NodeVisitor首先遍历AST深度优先,并在输入时仅访问每个节点一次.因此,做一些严肃的事情是有问题的.是否可以更改其默认行为?
我有一个由不同种类的节点组成的异构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不是多态的,并且无法将调用分派到最专门的方法,例如: …
以下是我用更好的代码示例提出的问题的后续问题:
以下代码使用访问者模式:
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) 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) 我正在使用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
我遇到了一个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) 以下是使用泛型的访问者模式的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) 我使用模板化的游标来为几个类定义统一的接口.为了定义__str__和__repr__方法,我想以编程方式"X"从boost::python::class对象中获取类名(在引用文档中).那可能吗?
通过将类名作为参数传递给访问者的构造函数,可以很容易地处理它,但自动拥有它会更优雅.
visitor ×9
c++ ×3
java ×3
algorithm ×1
boost-python ×1
c++11 ×1
generics ×1
javaparser ×1
polymorphism ×1
python ×1
qt ×1
qvariant ×1
templates ×1
tree ×1