Добавление элементов в вектор внутри класса c ++ не сохраняется - PullRequest
1 голос
/ 13 ноября 2009

Редактировать: мой отладчик лгал мне. Это все не имеет значения

Привет всем,

Я посмотрел на Добавление элемента в вектор , но в моем случае это бесполезно.

Я пытаюсь добавить элемент (пользовательский класс LatLng) в другой объект (Cluster) из третьего объекта (ClusterManager).

Когда я передаю свой LatLng в Cluster (последняя строка ClusterManager.cpp) и перехожу в Cluster :: addLocation, в конце выполнения функции gdb говорит, что мой новый LatLng был добавлен в Cluster, но в тот момент, когда я перехожу обратно в область видимости самого высокого класса, ClusterManager, новый LatLng, добавленный к вектору 'locStore', отсутствует ни во время выполнения, ни в отладке.

Есть идеи?

DJS.

DE: Xcode 3.2 (предназначен для отладки 10.5) ОС: OSX 10.6 Компилятор: GCC 4.2 Арка: x86_64

ClusterManager.cpp (откуда все это вызывается):

void ClusterManager::assignPointsToNearestCluster()
{
    //Iterate through the points.
    for (int i = 0; i < locationStore.size(); i++)
    {
        double closestClusterDistance = 100.1;
        // Make sure to chuck the shits if we don't find a cluster.
        int closestCluster = -1;
        int numClusters = clusterStore.size();
        // Iterate through the clusters.
        for (int j = 0; j < numClusters; j++) {
            double thisDistance = locationStore[i].getDistanceToPoint( *(clusterStore[j].getCentroid()) );

            // If there's a closer cluster, make note of it.
            if (thisDistance < closestClusterDistance) {
                closestClusterDistance = thisDistance;
                closestCluster = j;
            }
        }
        // Remember the penultiment closest cluster.
        this->clusterStore[closestCluster].addLocation( this->locationStore[i] );
    }
}

ClusterManager.h

#include "Cluster.h"
#include "LatLng.h"
#include <vector>

class ClusterManager{
private:
    std::vector<Cluster> clusterStore;
    std::vector<LatLng> locationStore;
public:
    ClusterManager();
    void assignPointsToNearestCluster();
    void addLocation(int,double,double);
};

Cluster.h:

#include <vector>
#include <string>

#include "LatLng.h"

class Cluster {
private:
    std::vector<LatLng> locStore;
    LatLng newCentroid;
    bool lockCentroid;
    int clusterSize;
    int clusterID;
public:
    Cluster(int,LatLng&);
    void addLocation(LatLng&);
    LatLng* getCentroid();
};

Cluster.cpp

Cluster::Cluster(int newId, LatLng &startPoint)
{
    this->clusterID = newId;
    this->newCentroid = startPoint;
};

void Cluster::addLocation(LatLng &newLocation)
{
    (this->locStore).push_back( newLocation );  
};

LatLng* Cluster::getCentroid()
{
    return &newCentroid;
};

Ответы [ 4 ]

2 голосов
/ 13 ноября 2009

Возможно, отладчик врет. Я обнаружил, что у Xcode есть проблемы с просмотром содержимого векторов, попробуйте использовать некоторые утверждения, чтобы убедиться, что рассматриваемый вектор действительно заполнен.

0 голосов
/ 13 ноября 2009

Как выглядит ваш конструктор копирования для класса LatLng? Когда вы вызываете std::vector::push_back(), копия аргумента создается перед добавлением его в вектор. Отсутствие не сгенерированного компилятором конструктора копирования может указывать на то, почему вы не видите определенные значения в целевом векторе.

Кроме того, вы упоминаете, что получаете итерационную ошибку при переборе содержимого вектора. Это говорит о том, что в векторе меньше элементов, чем вы ожидали. Рассмотрим итерацию по вектору с использованием цикла for, ограниченного vector.size().

0 голосов
/ 13 ноября 2009

Что делает конструктор копирования LatLng? Это определяет, что на самом деле оказывается в векторе, когда вы вызываете push_back.

Кстати, в ваших векторных циклах немного эффективнее использовать итераторы, чем индексы - без использования оператора [], в пользу прямых ссылок на члены вектора через итератор.

0 голосов
/ 13 ноября 2009

std :: vector :: push_back () ожидает константную ссылку в качестве входных данных, но вместо этого вы передаете ей неконстантную ссылку, поэтому компилятор должен создать временный объект LatLng, который добавляется в вектор вместо вашего исходного объекта LatLng.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...