【问题标题】:is there a good way to constructs objects with changing parameter types in c++?有没有一种好方法可以在 c++ 中构造具有不断变化的参数类型的对象?
【发布时间】:2021-06-24 18:36:36
【问题描述】:

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

代码本身可能很长,所以我尝试以抽象形式发布:

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)
        {}
}

【问题讨论】:

  • 你能告诉我们你的代码吗?
  • 请包含minimal reproducible example 书面文字对于描述编码细节非常糟糕。
  • 如果构造函数的参数数量或类型不同,那么您必须编写每个构造函数...除非您使用模板。
  • 听起来像是模板和概念的工作(在最新版本的 C++ 标准中)。您可以在 C++ 教科书中找到更多相关信息。
  • 我添加了一些示例代码。我希望它有用

标签: c++ constructor parameter-passing


【解决方案1】:

这是您使用模板的代码:

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 的继承,因为模板类已经确保所有 child_robot 变体都将具有 move_tcp。我将 location-member 重命名为 x_location_,因为这三个成员的类型相同。

【讨论】:

  • 您的child_robot 没有使用T 参数。为什么需要它?
  • 好点。不需要,因为 OP 的代码 sn-p 在三个子机器人之间也没有区别(除了变量名)。由于示例显然不完整,这也适用于我的变体。
  • 他们都覆盖move_tcp,大概是为了做不同的事情。
  • 是的,对不起,我没有澄清这一点。每个对象的 move_tcp 函数都不同
【解决方案2】:

我应该更好地搜索:您可以在参数列表中使用父类上的指针并输入指向子类的指针:

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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-09
    • 1970-01-01
    • 2011-03-15
    • 2022-11-30
    相关资源
    最近更新 更多