Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 应用\访问者不更改对象_C++_C++11_Boost Variant_Apply Visitor_Static Visitor - Fatal编程技术网

C++ 应用\访问者不更改对象

C++ 应用\访问者不更改对象,c++,c++11,boost-variant,apply-visitor,static-visitor,C++,C++11,Boost Variant,Apply Visitor,Static Visitor,我继承了boost::static_visitor的内容,并定义了一个类,如下所示: class move_visitor : public boost::static_visitor<> { private: double m_dx, m_dy; public: move_visitor() : m_dx(0.0), m_dy(0.0) {} move_visitor(double dx, double dy) : m_dx(dx), m_dy(dy

我继承了
boost::static_visitor
的内容,并定义了一个类,如下所示:

class move_visitor : public boost::static_visitor<> {

private:

    double m_dx, m_dy;

public:

    move_visitor() : m_dx(0.0), m_dy(0.0) {}
    move_visitor(double dx, double dy) : m_dx(dx), m_dy(dy) {}
    ~move_visitor() {}

    void operator () (Point &p) const {
        p.X(p.X() + m_dx);
        p.Y(p.Y() + m_dy);
    }

    void operator () (Circle &c) const {

        Point center_point(c.CentrePoint().X() + m_dx, c.CentrePoint().Y() + m_dy);
        c.CentrePoint(center_point);
    }

    void operator() (Line &l) const {
        Point start(l.Start().X() + m_dx, l.Start().Y() + m_dy),
            end(l.End().X() + m_dx, l.End().Y() + m_dy);

        l.Start(start);
        l.End(end);

    }
};
class move\u visitor:public boost::static\u visitor{
私人:
双m_dx,m_dy;
公众:
move_visitor():m_dx(0.0),m_dy(0.0){}
移动访问者(双dx,双dy):m_dx(dx),m_dy(dy){}
~move_visitor(){}
void运算符()(点和点)常量{
p、 X(p.X()+m_-dx);
p、 Y(p.Y()+m_-dy);
}
void运算符()(圆和c)常量{
点中心点(c.CentrePoint().X()+m_dx,c.CentrePoint().Y()+m_dy);
c、 中心点(中心点);
}
void运算符()(直线和直线)常量{
点启动(l.start().X()+m_dx,l.start().Y()+m_dy),
结束(l.end().X()+m_dx,l.end().Y()+m_dy);
l、 启动(启动);
l、 完(完),;
}
};
此类用于更改某些对象、点、线和圆的x和y位置

当我执行以下代码时:

int main()
{

typedef boost::variant<Point, Line, Circle> ShapeType;

Point p(1, 2);
Line l(p, p);
Circle c(p, 5);

ShapeType shape_variant;

std::cout << p << "\n\n"
          << l << "\n\n" 
          << c << "\n\n";

shape_variant = p;
boost::apply_visitor(move_visitor(2, 2), shape_variant);

std::cout << p << std::endl;

shape_variant = l;
boost::apply_visitor(move_visitor(2, 2), shape_variant);
std::cout << std::endl << l << std::endl;

return 0;
}
intmain()
{
typedef boost::variant ShapeType;
p点(1,2);
线l(p,p);
c圈(p,5);
形状类型形状变量;

std::cout您正在修改
shape\u variant
,而不是
p
l

试一试


std::cout您正在修改
shape\u variant
,而不是
p
l

试一试

std::cout
std::cout << boost::get<Point>(shape_variant) << std::endl;
std::cout << boost::get<Line>(shape_variant) << std::endl;