首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >向向量添加对象将覆盖现有的对象。

向向量添加对象将覆盖现有的对象。
EN

Stack Overflow用户
提问于 2015-12-21 18:25:21
回答 2查看 66关注 0票数 0

我有两个类:GenomeRankedNodeRandomRankedTPNGenerator.RandomRankedTPNGenerator的责任只是随机创建一个GenomeRankedNode.GenomeRankedNode有四个属性: int、int、int*和int。我的main有一个应该使用RandomRankedTPNGenerator.填充的向量为此,我主要有:

代码语言:javascript
复制
std::vector<GenomeRankedNode*> population;
population.resize(50);
for (int i = 0; i < popsize; i++ ) {
    RandomRankedTPNGenerator* generator = new RandomRankedTPNGenerator();
    GenomeRankedNode node* = generator->randomNode(numParents);
    population[i] = node;
    delete generator;
}

RandomRankedTPNGenerator,中,重要的函数是randomNode():

代码语言:javascript
复制
GenomeRankedNode* RandomRankedTPNGenerator::randomNode(int numParents){
    int function = randomFunction(); //just gets a random number
    int* weights = randomWeights(numParents); //just gets a random number
    int variance = randomVariance(); //just gets a random number
    GenomeRankedNode* node = new GenomeRankedNode(function, numParents, weights, variance); 
    return node;
}

以上代码正确地生成随机GenomeRankedNode。问题是,在population中,当我添加对象时,现有的对象显然是“重写的”(我知道它们实际上并没有被覆盖.)。另一方面, populated 被填充了不同的地址。如果我使用不同的RandomRankedTPNGenerator实例来创建不同的GenomeRankedNodeGenomeRankedNode对象,为什么居群中指向内存中相同空间的所有指针都会导致populationi为每个i指向的值是相同的?

下面是GenomeRankedNode.cpp的代码

代码语言:javascript
复制
int function;
int* weights;
int numNodeParents;
int variance;

double vars[11] = {0.0005, 0.001, 0.005, 0.01, 0.05, 0.1, 0.5, 1, 5, 10, 50};

GenomeRankedNode::GenomeRankedNode()
{
    function = 0;
    weights = 0;
    numNodeParents = 1;
    variance = 0;
}

GenomeRankedNode::GenomeRankedNode(int inFunction, int inNumParents, int* inWeights, int inVariance)
{
    function = inFunction;
    numNodeParents = inNumParents;
    weights = inWeights;
    variance = inVariance;
}

GenomeRankedNode::GenomeRankedNode(GenomeRankedNode* inNode)
{
    function = inNode->getFunction();
    numNodeParents = inNode->getNumParents();
    weights = inNode->getWeights();
    variance = inNode->getVariance();
}

GenomeRankedNode::GenomeRankedNode(const GenomeRankedNode &inNode)
{
    function = inNode.getFunction();
    numNodeParents = inNode.getNumParents();
    variance = inNode.getVariance();

    //deep copy
    if (inNode.getWeights()){
        weights = new int[numNodeParents];
        for (int i = 0; i < numNodeParents; i++)
            weights[i] = inNode.getWeights()[i];
    }
}

GenomeRankedNode& GenomeRankedNode::operator= (const GenomeRankedNode &inNode)
{

    //self-assignment check
    if (this == &inNode)
        return *this;

    function = inNode.getFunction();
    numNodeParents = inNode.getNumParents();
    variance = inNode.getVariance();

    // explicitly deallocate values
    delete[] weights;

    // deep copy
    if (inNode.getWeights()){
        weights = new int[numNodeParents];
        for (int i = 0; i < numNodeParents; i++)
            weights[i] = inNode.getWeights()[i];
    }
    else
        weights = 0;

    return *this;
}

GenomeRankedNode::~GenomeRankedNode(void)
{
    delete &function;
    delete &numNodeParents;
    delete weights;
    delete &variance;
}

int GenomeRankedNode::getFunction() const
{
    return function;
}

int* GenomeRankedNode::getWeights() const
{
    return weights;
}

int GenomeRankedNode::getNumParents() const
{
    return numNodeParents;
}

int GenomeRankedNode::getVariance() const
{
    return variance;
}

void GenomeRankedNode::setWeights(int *inWeights)
{
    weights = inWeights;
}

void GenomeRankedNode::setFunction(int inFunction)
{
    function = inFunction;
}

void GenomeRankedNode::setVariance(int inVariance)
{
    variance = inVariance;
}

double GenomeRankedNode::getRealVariance(int inVariance) const
{
    return vars[inVariance];
}

为了检查这些不当行为,我在main中添加了以下内容:

代码语言:javascript
复制
for (int i = 0; i < population.size(); i++){
  cout << population.at(i)->toString();

}

假定population.size() = 3,输出是:

代码语言:javascript
复制
Function: 1
Weights: 1 1
Variance: 2

Function: 1
Weights: 1 1
Variance: 2

Function: 1
Weights: 1 1
Variance: 2

另一方面,如果我加上这一行:

代码语言:javascript
复制
cout << population.at(i)->toString(); 

在生成随机GenomeRankedNode对象的循环中,我有:

代码语言:javascript
复制
Function: 0
Weights: 3 4
Variance: 1

Function: 1
Weights: 4 1
Variance: 3

Function = 1
Weights = 1 1
Variance = 2

考虑到这一点,我的结论是:由于某种原因,所有创建的GenomeRankedNode都指向内存中相同的插槽。因此,每当一个新的GenomeRankedNode被实例化时,所有其他指针(GenomeRankedNode*)都会更新它们的指向值!它类似于浅薄的和深的复制问题,但我不知道它是从哪里来的!

EN

回答 2

Stack Overflow用户

发布于 2015-12-21 18:30:34

我看到的一个问题是,您正在将人口的ith值设置为GenomeRankedType,而不是GenomeRankedType* (您说它是存储的类型)。

因此,修改代码的顶部以:

代码语言:javascript
复制
std::vector<GenomeRankedNode*> population;
population.resize(50);
for (int i = 0; i < popsize; i++ ) {
    RandomRankedTPNGenerator* generator = new RandomRankedTPNGenerator();
    GenomeRankedNode* node = generator->randomNode(numParents);
    population[i] = node;
    delete generator;
}

如果这对你有帮助,请告诉我!

票数 2
EN

Stack Overflow用户

发布于 2015-12-23 03:20:53

我搬家了:

代码语言:javascript
复制
int function;
int* weights;
int numNodeParents;
int variance;

从GenomeRankedNode.cpp到GenomeRankedNode.h作为专用。这个解决了问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34402062

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档