现在我有了这个奇怪的错误。我有一个名为ENGComponent的类,它将根据其优先级将自身推入5个私有静态向量之一。通过调用GetComponentList(priority)获得向量。这是在构造函数中完成的。但是,当我们离开构造函数后,推回将被忽略,向量中包含0项。这是代码:

ENGComponent:

#include "../../inc/engine/eng_component.h"

#include <vector>
#include <iostream>
#include <string>

#include "../../inc/engine/eng_logger.h"

//Static member var inits
std::vector<ENGComponent*> ENGComponent::m_ComponentList_1 = std::vector<ENGComponent*>();
std::vector<ENGComponent*> ENGComponent::m_ComponentList_2 = std::vector<ENGComponent*>();
std::vector<ENGComponent*> ENGComponent::m_ComponentList_3 = std::vector<ENGComponent*>();
std::vector<ENGComponent*> ENGComponent::m_ComponentList_4 = std::vector<ENGComponent*>();
std::vector<ENGComponent*> ENGComponent::m_ComponentList_5 = std::vector<ENGComponent*>();

ENGComponent::ENGComponent( const std::string& name,
                            Priority priority,
                            ENGObject* owner): m_Name(name),
                                               m_Priority(priority),
                                               m_pOwnerObject(owner)

{
    std::vector<ENGComponent*> compList = GetComponentList(m_Priority);

    if (compList == m_ComponentList_5)
        m_Priority = PRIORITY_5;

    compList.push_back(this);

}

std::vector<ENGComponent*>& ENGComponent::GetComponentList(Priority priority)
{
    switch(priority)
    {
        case PRIORITY_1:
            return m_ComponentList_1;
        case PRIORITY_2:
            return m_ComponentList_2;
            break;
        case PRIORITY_3:
            return m_ComponentList_3;
            break;
        case PRIORITY_4:
            return m_ComponentList_4;
            break;
        case PRIORITY_5:
            return m_ComponentList_5;
            break;
        default:
            //Error! TODO: Log error, change to priority 5 and move on
            //TODO: LOG error
            std::string errMessage = "Component priority unknown! Returning priority 5...";
            ENGLogger::Log(errMessage, ENGLogger::LogLevel::ERROR);

            return m_ComponentList_5;
    }
}


现在,如果在实例化ENGComponent对象之后,在其他任何地方调用ENGComponent :: GetComponentList(priority),则即使我将对象推回,返回的m_ComponentList_X的大小也始终为0。现在来了奇怪的事情。如果我跳过了整个优先级,直接将其推入向量,它就可以正常工作(即向量的大小增加1且对象被成功推回)。即使当我从对象外部调用GetComponentList()时也是如此。像这样:

ENGComponent::ENGComponent( const std::string& name,
                            Priority priority,
                            ENGObject* owner): m_Name(name),
                                               m_Priority(priority),
                                               m_pOwnerObject(owner)

{
    m_ComponentList_5.push_back(this);
}


那么,我在这里做错了什么?有人可以告诉我吗?提前致谢。

最佳答案

尽管GetComponentList返回向量的引用,但是您将其作为单独的副本存储到compList中。因此,添加到compList中的任何元素都不会添加到原始向量中。

您需要将向量存储到引用中:

std::vector<ENGComponent*>& compList = GetComponentList(m_Priority);


因此,对compList的任何修改都会反映到原始向量。

没有什么奇怪的:

m_ComponentList_5.push_back(this);


在这里,您直接使用矢量进行修改。因此,这很好。

10-05 21:39