返回的向量定义为&#34; std :: vector&lt; <error-type>,std :: allocator&lt; <error-type>&gt;&gt;

时间:2018-01-15 19:46:00

标签: c++ vector return

我试图将一个结构的向量从一个对象返回到另一个对象。我的第一个想法是返回对向量的引用。两个目标文件都包含有问题的结构(侦听器结构)和执行返回外观的函数:

vector<Listener>* Component::GetListeners() {
    vector<Listener> listeners;
    for (int i = 0; i < listenerSize; i++) {
        Listener listener = { id, static_cast<EventType>(Component::listensFor[i]) };
        listeners.push_back(listener);
    }
    return &listeners;
}

构造一个侦听器向量,然后返回向量的地址

当我在下一个函数中收到指针时出现问题:

void Entity::AddComponent(Component c) {
    components.push_back(c);
    vector<Listener> *listeners = c.GetListeners();
    for (int i = 0; i < listeners->size; i++) {

    }
}

错误发生在以下行:

vector<Listener> *listeners = c.GetListeners();

错误说明

A value of type "std::vector<<error-type>, std::allocator<<error-type>>>*" cannot be used to initialize entity of type "std::vector<<Listener>, std::allocator<<Listener>>>*"

我试图研究这个错误,但没有说明为什么它确实假定返回的向量被定义为错误类型。任何帮助将不胜感激,提前谢谢。

修改

我被告知当我传递侦听器的地址时,这是一个局部变量,当函数完成时它没有绕过局部变量的破坏(实际上非​​常明显,当它引起我的注意时谢谢大家) 。不幸的是,即使我已经做了调整以自己返回向量而不是它的地址,我仍然收到完全相同的错误消息(当然减去指针)。我的代码现在是这样的:

vector<Listener> Component::GetListeners() {
    vector<Listener> listeners;
    for (int i = 0; i < listenerSize; i++) {
        Listener listener = { this, static_cast<EventType>(Component::listensFor[i]) };
        listeners.push_back(listener);
    }
    return listeners;
}

void Entity::AddComponent(Component c) {
    components.push_back(c);
    vector<Listener> listeners = c.GetListeners();
    for (int i = 0; i < listeners.size; i++) {
    }
}

更多代码 Event.h

struct Listener {
    Component *component;
    EventType type;
};

enum EventType {
    PhysCol = 0,
    WheelRayCol = 1,
    Accelerate = 2,
    Turn = 3,
    Fire = 4,
    Damage = 5
};

class Event {
public:
    static EventType type;
    Entity *actor;
};

Component.h

#include "Event.h"
class Component {
private:
    void Invoke(Event *e);
    //int entityID;
    Entity *entity;
    int id;
public:
    static int listensFor[0];
    //static vector<int> listensFor;
    static int listenerSize;
    static ComponentType type;
    bool enabled = true;

    //Component();
    void HandleEvent(Event *event);
    //static Component CreateComponent(ComponentType type);
    vector<Listener> GetListeners();
    int GetID();
    void RegisterEntity(Entity *e);
};

int Component::listenerSize = 0;

Component.cpp

#include "Component.h"
vector<Listener> Component::GetListeners() {
    vector<Listener> listeners;
    for (int i = 0; i < listenerSize; i++) {
        Listener listener = { this, static_cast<EventType>(Component::listensFor[i]) };
        listeners.push_back(listener);
    }
    return listeners;
}

Entity.h

#include "Event.h"
class Entity {
public:
    Transform transform;

    Component GetComponent(ComponentType type);
    void HandleEvent(Event *event);
    void AddComponent(Component component);

    int GetId();
    std::string GetTag();
    bool MatchesTag(std::string tag);
private:
    int id;
    std::string tag;
    std::vector<Component> components;
    std::vector<Listener> listeners;
};

Entity.cpp

#include "Entity.h"
void Entity::AddComponent(Component c) {
    components.push_back(c);
    vector<Listener> l = c.GetListeners();
    for (int i = 0; i < l.size; i++) {
        listeners.push_back(l[i]);
    }
}

2 个答案:

答案 0 :(得分:0)

在Component :: GetListeners中,您将返回函数局部变量的地址,该变量立即超出范围并被破坏。您可能需要使其不是本地函数或不返回指针。

如果使用现代的c ++编译器(c ++ 11),你可以使用返回类型“vector”和“return std :: move(listeners);”并避免复制。我的理解是,更现代的(c ++ 17)编译器会自动执行此操作。

答案 1 :(得分:0)

db返回即将销毁的局部变量的地址 - 这显然很糟糕。只需按值返回矢量即可。编译器很可能会忽略副本。