c++ - 遗传算法和神经网络 : taking address of temporary [-fpermissive]

标签 c++ neural-network genetic-algorithm temporary-objects

我正在研究基因进化的神经网络。我在 2008 年使用 visual studio 2005 编写了一个程序。现在我将该程序转换为支持 c++11 的 Eclipse(Linux) 和 VS 2013(Win) 项目。运行后,两个项目都报了同样的错误:

taking address of temporary [-fpermissive]

经过大量搜索后,我发现这个错误是由于新的 C++ 标准不允许获取临时对象的地址而产生的。由于所有对象都是使用“new”创建的(所以我想它们应该一直可用)。我部分地解决了问题,但不知道如何解决。如果您运行 eclipse 项目,它只会突出显示项目中的两个错误。

因为它很难用语言解释,因为它需要完整的代码来检查,所以我在 git 上托管了 eclipse 项目 https://bitbucket.org/a-akram/geans.git我让每个人都可以访问。

主要问题是变量 wp1wp2m_vPopulatin 是一个包含神经网络地址的 vector 。

CNeuralNetwork* CGeneticEngine::Evolve()
{
    CLearningEngine *l;
    double totalError =  0.0;
    for (int iter = 0;iter < CGN_MAXITER; iter++)
    {
        for (int i = 0;i < CGN_POPULATION; i++)
        {
            l = new CLearningEngine(m_vPopulation[i]);
            l->Run(m_vTrainingDataset);
            for(unsigned int p = 0; p < m_vTrainingDataset->size(); p++)
            {
                totalError = totalError + m_vPopulation[i]->getm_dTotalNetworkError();
                totalError = totalError/m_vTrainingDataset->size();
            }
            if (totalError < CGN_THRESHOLD)
                 return m_vPopulation[i];

            m_dErrors[i] = totalError;
        }
        SortFitnesses();
        NewPopulation();
    }
    return NULL;

}

void CGeneticEngine::NewPopulation()
{
    int id1, id2;
    double temp;
    std::vector <CSynapticConnection *> *wp1;
    std::vector <CSynapticConnection *> *wp2;
    for (int i=0;i<CGN_POPULATION / 2;i++)
    {
        id1 = rand() % CGN_POPULATION / 2;
        id2 = rand() % CGN_POPULATION / 2 + CGN_POPULATION / 2;

        wp1 = &m_vPopulation[id1]->getm_vListofSynaptics();
        wp2 = &m_vPopulation[id2]->getm_vListofSynaptics();

        // Cross over the weights.
        for (int j = 0; j < 2; j++)
        {
            temp = (*wp1)[j+6]->getWeight();
            (*wp1)[j+6]->setWeight((*wp2)[j+6]->getWeight() );
            (*wp2)[j+6]->setWeight(temp);
        }

        //  adding slight genetic change due to crossover randomly.
        if (rand() % 10 < 2)
        {
            for(unsigned int j = 0; j < wp1->size();j++)
                (*wp1)[j]->changeWeight((double)(rand())/(32767/2) - 1);

            for(unsigned int j = 0; j < wp2->size();j++)
                (*wp2)[j]->changeWeight((double)(rand())/(32767/2) - 1);
         }
    }
}

因为这是我在这个论坛上的第一个问题,所以我可能措辞不当,所以我请求版主暂时不要关闭它。如有必要,我会说得更清楚。但是有了项目文件在手,你们将很容易找出问题和解决方案。

非常感谢您帮助解决问题...如果您需要任何进一步的信息,请告诉我。

最佳答案

首先考虑 CNeuralNetwork 类的这个子集:

class CNeuralNetwork
{
  // ...
public:
  std::vector<CSynapticConnection *> getm_vListofSynaptics()
  {
    return m_vListofSynaptics;
  }

  std::vector<CSynapticConnection*> m_vListofSynaptics;
  // ...
};

这里有一个返回临时值的 getter (getm_vListofSynaptics()):公共(public)数据成员 m_vListofSynaptics拷贝

CGeneticEngine::NewPopulation() 函数中,您正在获取临时对象的地址,这会触发错误:

wp1 = &m_vPopulation[id1]->getm_vListofSynaptics();
wp2 = &m_vPopulation[id2]->getm_vListofSynaptics();

(有关详细信息,请参阅 Why is taking the address of a temporary illegal?)。

您必须考虑/应用一些更改:

  • getter/setter 对于行为封装/隐藏属性的内部表示很有用(?),但是 m_vListofSynaptics 是公开的,因此 getter“几乎什么都买不到”(例如,请参阅Why use getters and setters?/Public Data members vs Getters, Setters 一些见解)

  • 关于错误,您可以(这只是一个“快速修复”,看似可以更改设计以完全避免 getter):

    • 更改 getter 以便它返回指向数据成员的引用/指针(数据成员应该是私有(private)的)

      class CNeuralNetwork
      {
      // ...
      public:
        std::vector<CSynapticConnection *> *getm_vListofSynaptics()
        {
          return &m_vListofSynaptics;
        }
      private:
        std::vector<CSynapticConnection*> m_vListofSynaptics;
      };
      
    • 直接访问 m_vListofSynaptics 数据成员(可能不是一个好主意):

      wp1 = &m_vPopulation[id1]->m_vListofSynaptics;
      

      (看看If a variable has getter and setter, should it be public?)

关于c++ - 遗传算法和神经网络 : taking address of temporary [-fpermissive],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28928396/

相关文章:

c++ - C++ 11 中专用模板的名称别名

c++ - 如何在虚幻引擎项目中使用C++ Core Checker?

c++ - 替换失败

python - 无法操作列表

c++ - 如何使用遗传算法求解线性方程组?

ruby - 需要帮助使遗传算法适应 Ruby 上的 "solve"Traveling Salesman

arrays - Swift:在数组中追加项目的算法

c++ - 是否可以在一个类中包含另一个类中的类对象数组?

artificial-intelligence - 信息建模

python - 具有两个预训练 ResNet 50 的连体神经网络 - 测试模型时出现奇怪的行为