Звоните по ссылке с QVector - PullRequest
0 голосов
/ 03 мая 2010

У меня в Объекте есть QVector of Coordinates (мой тип), который я хочу перенести в другой Вектор (я проверяю и затем хочу использовать ist).

Заголовок

bool getVector(QVector<Coordinates> &getCoordinates );

C File

static QVector<Coordinates> current;


int getVector( QVector<Coordinates> &getCoordinates)
{

.... stuff ...

 getCoordinates = current;

.... stuff ....
return 0;
}

И я использую это как

....

QVector<Coordinates> currentCoordinates;
getVector(currentCoordinates);

currentCoordinates.X // CRASH

Отладчик переходит на эту строку, где происходит живое падение

  inline QVector(const QVector<T> &v) : d(v.d) { d->ref.ref(); if (!d->sharable) detach_helper(); }

Итак, как мне это исправить? Как я могу использовать это, чтобы получить все другие переменные с этим методом.

Ответы [ 2 ]

0 голосов
/ 04 мая 2010

Для Гарета и Форума:

заголовок:

typedef  QVector<Coordinates> VesselCoordinates;

  bool (*getVessel)(Charakter forCharakter, Vessel& getVessel,VesselCoordinates &getCoordinates );

позже я связываю указатель этой функции со статической функцией (потому что эта часть моей Программы будет однажды преобразована в c)

нижний уровень файла cpp:

     static struct {
            Charakter currentPlayerVessel;
            VesselCoordinates possibility;
        }data;
         static bool getVessel(Charakter forCharakter, Vessel& getVessel,VesselCoordinates &getCoordinates );

// funktion to bind the funktion pointer to this static funktion so it can be called outside the File

        static bool serverNamespace::getVessel(Charakter forCharakter, Vessel& getVessel,VesselCoordinates &getCoordinates )
        {
            bool retValue= false;

            if ( forCharakter == data.currentPlayerVessel){
                // TODO abfragen ob die Adresse regestriert ist!
                if ((true == minSize()) and  ((true == shipsInRow())or (true == shipsInLine())))
            {
                retValue = true;
                Vessel test = (Vessel)data.possibility.size();
                getVessel =  test;
                getCoordinates = data.possibility;
            }
        }
        return retValue;
    }

И тогда я могу использовать это в cpp-файле верхнего уровня, чтобы получить необходимую информацию:

// in an Funktion : 

 VesselCoordinates currentCoordinates;
    currentCoordinates.clear();

    Vessel currentVessel;

if (true == basicFleet->getVessel(currentCharakter,currentVessel, currentCoordinates ))

// doing stuff to it 

так что все хорошо, но ваша идея работала так же хорошо. Может быть, вы можете понять, почему моя идея тоже работает.

Спасибо

Elektor

0 голосов
/ 03 мая 2010

Вероятной причиной вашей проблемы является то, что current не был создан до вызова getVector. Инициализация статических объектов в C ++ - это непростая область и частый источник ошибок - для получения дополнительной информации см. этот вопрос и запись fiasco FAQ по порядку статической инициализации .

Простое решение этой проблемы - предоставить доступ к current через функцию, т.е. заменить

static QVector<Coordinates> current;

с

static QVector<Coordinates>& getCurrent()
{
    static QVector<Coordinates> current;
    return current;
}

Обратите внимание, что указанная выше функция не является поточно-ориентированной. Если несколько потоков могут вызывать getCurrent, тогда он должен быть защищен с помощью QMutex.

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