我正在构建一个C ++ API,仅用于学习目的,我需要一个类 有两个容器。假设它们最初是类型vector<>。
<?php
$servername = "xxx";
$username = "xxx";
$password = "xxx";
$dbname = "registers";
$con = new mysqli($servername, $username, $password, $dbname);
$user_name = $_POST["cphone"];
$sql_query = "select id from users where phone like '$user_name';";
$result = mysqli_query($con,$sql_query);
if(mysqli_num_rows($result) >0 )
{
$row = mysqli_fetch_assoc($result);
$name =$row["id"];
echo "$name";
}
else
{
echo "+";
}
?>
但如果有一天我必须更改这些容器的类型(例如列表),我不希望此API的用户需要更改其代码中的任何内容。
因此,考虑到containerA和containerB类型已更改,当使用上面的getter,返回向量&lt;&gt;时,API用户需要更改其代码以匹配新类型的API容器。
我认为返回迭代器而不是vector&lt;&gt;可以帮助我。
class MyClass
{
private:
std::vector<int> containerA;
std::vector<double> containerB;
public:
std::vector<int> *getContainerA();
std::vector<double> *getContainerB();
};
这是事情的方式吗?有没有更好的办法?谢谢。
答案 0 :(得分:1)
而是使用像
这样的getter const std::vector<int>& getContainerA() const { return containerA; }
让您的客户使用
std::vector<int>::const_iterator
来自参考文献。
但如果有一天我必须更改这些容器的类型(例如列表),我不希望此API的用户需要更改其代码中的任何内容。
您还可以使用特定类typedef
来公开基础容器类型:
typedef std::vector<int> ContainerAType;
const ContainerAType& getContainerA() const { return containerA; }
请注意,分发迭代器是不好的,因为在更改底层容器时这些迭代器可能会变得无效。
如果客户应该收到有关更改的通知,那么您需要一个单独的机制,例如: Observer。
答案 1 :(得分:1)
我建议结合πάνταῥεῖ的想法和你的:两者都定义一个类型别名,并返回迭代器:
typedef std::vector<int> ContainerAType;
ContainerAType::iterator beginContainerA();
此外,您还需要一个const版本,以便可以在const实例上使用迭代器:
ContainerAType::const_iterator beginContainerA() const;
考虑是否需要非常规访问。
考虑返回一系列迭代器:
boost::iterator_range<ContainerAType::iterator> containerA();
但是,要真正保护客户端免受任何更改,您需要使用类型擦除迭代器。使用类型擦除,客户端甚至不需要重新编译,如果您从矢量更改为列表(但您还必须使用pimpl模式,以实现这一点)。您甚至可以完全停止使用容器,并返回生成数据的自定义迭代器。
Boost让你了解到:http://www.boost.org/doc/libs/1_54_0/libs/range/doc/html/range/reference/ranges/any_range.html由于在内部使用虚函数调用,类型擦除迭代器确实有一些开销。