我试图将一个结构的向量从一个对象返回到另一个对象。我的第一个想法是返回对向量的引用。两个目标文件都包含有问题的结构(侦听器结构)和执行返回外观的函数:
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]);
}
}
答案 0 :(得分:0)
在Component :: GetListeners中,您将返回函数局部变量的地址,该变量立即超出范围并被破坏。您可能需要使其不是本地函数或不返回指针。
如果使用现代的c ++编译器(c ++ 11),你可以使用返回类型“vector”和“return std :: move(listeners);”并避免复制。我的理解是,更现代的(c ++ 17)编译器会自动执行此操作。
答案 1 :(得分:0)
db
返回即将销毁的局部变量的地址 - 这显然很糟糕。只需按值返回矢量即可。编译器很可能会忽略副本。