在 C++ 中,有没有一种构造具有更改参数类型的对象的好方法?

is there a good way to constructs objects with changing parameter types in c++?

我是 c++ 的新手,想知道是否有更好的解决方案来解决这个问题。我目前有一个抽象 class 具有多个不同的 classes (i_c) 实现该接口和其他对象的构造函数,他们使用这些实现的 classes 作为参数一个时间。每个构造函数的其他参数保持不变。 所以我的方法是为对象和工厂方法的每个可能 i_c 构造一个构造函数,根据参数构造对象。 我知道您不能将抽象 class 作为参数,但是有没有另一种方法可以避免为每种参数类型编写构造函数? 提前致谢

代码本身可能太长 post 所以我试着用抽象的形式来做:

class parent_robot
{
public:
    virtual void move_tcp() = 0;
};

class child_robot_a
    : public parent_robot
{
public:
    void move_tcp() override;
private:
    Eigen::Affine3d gripper_location_;
};

class child_robot_b
    : public parent_robot
{
public:
    void move_tcp() override;
private:
    Eigen::Affine3d camera_location_;
};

class child_robot_c
    : public parent_robot
{
public:
    void move_tcp() override;
private:
    Eigen::Affine3d gripper_location_;
};


class gui_object_identical_a{

gui_object_identical_a::gui_object_identical_a(
            child_robot_a& r_a, 
            identical_parameter_a& a, 
            identical_parameter_a& b)
            :
            child_robot_(r_a),
            member_a_(a),
            member_b_(b)
        {}
}

class gui_object_identical_b{

gui_object_identical_b::gui_object_identical_b(
            child_robot_b& r_b, 
            identical_parameter_a& a, 
            identical_parameter_a& b)
            :
            child_robot_(r_b),
            member_a_(a),
            member_b_(b)
        {}
}

class gui_object_identical_c{

gui_object_identical_c::gui_object_identical_c(
            child_robot_b& r_c, 
            identical_parameter_a& a, 
            identical_parameter_a& b)
            :
            child_robot_(r_c),
            member_a_(a),
            member_b_(b)
        {}
}

这是您使用模板的代码:

class parent_robot
{
public:
    virtual void move_tcp() = 0;
};

template<class T>
class child_robot
    : parent_robot
{
public:
    void move_tcp() override;
private:
    Eigen::Affine3d x_location_;
};

template<class T>
class gui_object_identical{

gui_object_identical_a::gui_object_identical(
            child_robot<T>& r_a, 
            identical_parameter_a& a, 
            identical_parameter_a& b)
            :
            child_robot_(r_a),
            member_a_(a),
            member_b_(b)
        {}
}

如果需要,您可以扩展它以从 parent_robot 中删除继承,因为模板 class 已经确保所有 child_robot 变体都将具有 move_tcp。我将位置成员重命名为 x_location_,因为所有三个的类型都相同。

我应该搜索得更好:您可以在参数列表中的父项 class 上使用指针,然后输入指向子项的指针:

class gui_object_identical{

gui_object_identical::gui_object_identical(
            std::shared_ptr<parent_robot> r, 
            identical_parameter_a& a, 
            identical_parameter_a& b)
            :
            parent_robot_(r),
            member_a_(a),
            member_b_(b)
        {}
}


int main(int argc, char** argv)
{
    std::shared_ptr<parent_robot> p = std::make_shared<child_robot_a>();
    auto gui = gui_object_identical(p);
}