【问题标题】:How could I call a function as a pointer from an array in c++?如何在 c++ 中将函数调用为数组中的指针?
【发布时间】:2015-04-25 17:30:56
【问题描述】:

所以我使用这样的结构数组:

struct node
{
  char* name;
  int   value;
};

node *nodeArray = new node*[50];

我试图从数组中调用一个函数,这样我就可以像这样搜索元素:

struct node* newNode;
newNode = nodeArray->find(name);

如果 name 是 char*,因此一旦找到 name,它就会返回指向数组中节点的指针。

我将如何创建一个类以从数组中调用查找函数?

【问题讨论】:

  • 你真正想要达到什么目的?变量名称newNode 很混乱,你想找到一个现有的节点,如果没有找到就让函数创建一个新节点吗?此外,您不一定需要一个类,您可以创建一个免费的find() 函数,该函数对作为参数传递的nodeArray 进行操作。
  • node *nodeArray = new node*[50]; 类型不匹配。
  • 数组不能有成员函数,所以你不能做nodeArray->find(name)。它必须是find(nodeArray, name)

标签: c++ arrays class pointers


【解决方案1】:

如果你坚持使用节点数组类,我会这样解决。 请注意,我假设 node 的声明与原始帖子中的一样。

#include <vector>

class NodeArray
{
public:
    explicit NodeArray(size_t length)
        : nodes_(length)
    {}

    Node* find(const char* name){
        for (size_t i = 0; i != nodes_.size(); ++i){
            if (0 == strcmp(nodes_[i].name, name)){ // strcmp is not pretty though.
                return &(nodes_[i]);
            }
        }
        return NULL;
    }

    // TODO: add methods for filling/accessing the nodes..

private:
    std::vector<node> nodes_;
};

int main()
{
    NodeArray my_nodes(50);
    // do stuff
    node* some_node = my_nodes.find("some");
    if (some_node) { /* ... */ }
}

【讨论】:

  • 如果你已经使用了std::vector,这也可以用在第一位,并且适当的带有 lambda 函数的 std::find() 调用将使用更少的代码行。
  • @πάνταῥεῖ 这让我的回答没有用?我不信。此外,如果 OT 想要更多地控制他的节点数组,他无论如何都需要编写自己的类。
【解决方案2】:

您可以使用这个小“黑客”。它将起作用,因为NodeArray 没有数据成员也没有虚函数,因此您只需将第一个node 地址转换为指向NodeArray 的指针并调用find 函数。查找函数将获取第一个节点地址为this指针。

#include <cstring>
#include <iostream>

struct node
{
  char* name;
  int   value;
};

class NodeArray {

public:

    node* find(const char* name, int len) {

        node* current = (node*)this;

        for (int i = 0; i < len; current++) {

            if (current->name && !strcmp(current->name, name)) return current;

        }

        return nullptr;
    }

    node* get(int index) {

        return ((node*)this) + index;

    }

};

int main(int argc, char * argv[]) {

    NodeArray* node_array = (NodeArray*) (new node[50]);

    node_array->get(10)->name = "blabla";

    if (node_array->find("blabla", 50)) {

        std::cout << "FOUND!";

    }

    delete [] ((node*)node_array);

    return 0;

}

【讨论】:

  • 在我看来,你永远不应该编写这样的代码。那只是危险的。
  • @BetaCarotin:它可以让你做一些非常棘手的事情,从 HotSpot 来源获得,但你是对的,它很危险
猜你喜欢
  • 1970-01-01
  • 2022-01-20
  • 1970-01-01
  • 2019-01-25
  • 2015-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多