在 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);
}
我是 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);
}