如何使用另一个变量访问对象的变量/方法
Posted
技术标签:
【中文标题】如何使用另一个变量访问对象的变量/方法【英文标题】:How to Access an Object's Variables/Methods using Another Variable 【发布时间】:2016-02-16 20:24:18 【问题描述】:假设我有一个包含x
和y
的struct Node
,我想创建这些Node
s 的向量。
struct Node
int x;
int y;
Node(int x, int y);
;
vector<Node *> nodes;
我想编写在x
或y
上工作的各种函数。例如,我想编写一个sort
函数,该函数根据x
坐标对节点向量进行排序,另一个根据y
进行排序。
编写一个同时实现 sort_by_x 和 sort_by_y 的函数绝对是一个更好的主意。我正在考虑编写一个函数,它采用bool
之类的isX
并相应地执行排序。但是,我想避免两次编写相同的代码(一次用于 x,一次用于 y)。我想编写一段代码来执行相应的排序。我尝试使用以下代码来实现它,但它在 C++ 中无效(因为它期望 c
是 Node
中的变量之一)。
void mySort(vector<Node *> &nodes, bool isX)
char c;
if (isX)
c = 'x';
else
c = 'y';
// some code
nodes[i]->c // if c == 'x', x will be used, otherwise y.
能否请您给我一个解决方法来重写上述代码或基于不同变量实现相同功能的其他方式?
【问题讨论】:
如果您想要Node
s 的向量,请执行以下操作:std::vector<Node>
。指针向量通常不那么有趣。至于排序,已经有一个std::sort
函数,您可以将x
或y
的比较器传递给它。希望您很快就能简单地传递 &Node::x
或 &Node::y
而不是包装它。
感谢您的评论。排序只是一个简单的例子。我想实现一些 STL 中没有的其他功能。
您可以使用std::sort
作为示例并以相同的方式设计您的。更好的是,您可以使用类似于 std::invoke
的东西来使指向成员选项的指针工作并提供一个采用投影功能的版本。这两件事对所有方面都很有用。
非常感谢。我对这些概念不太熟悉,但我会看看。
顺便说一句,为什么你认为指针向量不好玩? :)
【参考方案1】:
您可以在此处使用指向成员的指针:
int Node::*m;
if (isX)
m = &Node::x;
else
m = &Node::y;
// some code
nodes[i]->*m
语法相当丑陋,但它完全符合您的要求。如果您有可用的 C++11,另一种方法是编写简单的 lambda 函数以返回 x
或 y
并将它们存储在 std::function
中;这效率稍低,但不那么丑陋且更通用。
【讨论】:
非常感谢。我听说过 lambda 函数,但以前从未使用过它们。我去看看。【参考方案2】:std::sort
允许将比较器作为第三个参数传入。您可以通过对x
和y
情况使用不同的比较器来更改排序行为。
std::sort(nodes.begin(), nodes.end(),
[](const Node *a, const Node *b) -> bool
return a->x < b->x;
);
【讨论】:
感谢您的回答。排序只是一个简单的例子。我想实现一些 STL 中没有的其他功能。顺便说一句,这是一个很好的提示。谢谢。【参考方案3】:您不必编写自己的函数来进行排序。标准库已经有一个通用的sort
函数。你可以这样使用它:
auto x_comparator = [](auto a, auto b) return a->x < b->x;
auto y_comparator = [](auto a, auto b) return a->y < b->y;
std::sort(nodes.begin(), nodes.end(), x_comparator); // sort by x
std::sort(nodes.begin(), nodes.end(), y_comparator); // sort by y
【讨论】:
感谢您的回答。排序只是一个简单的例子。我想实现一些 STL 中没有的其他功能。顺便说一句,这是一个很好的提示。谢谢。以上是关于如何使用另一个变量访问对象的变量/方法的主要内容,如果未能解决你的问题,请参考以下文章