使用QVector以参考方式致电

时间:2010-05-03 15:50:53

标签: qt reference vector

我在一个对象中有一个坐标QVector(我的类型),我想转移到另一个Vector(我验证并且想要使用ist)。

标题

bool getVector(QVector<Coordinates> &getCoordinates );

C档

static QVector<Coordinates> current;


int getVector( QVector<Coordinates> &getCoordinates)
{

.... stuff ...

 getCoordinates = current;

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

我用它就像

....

QVector<Coordinates> currentCoordinates;
getVector(currentCoordinates);

currentCoordinates.X // CRASH

调试器转到此行发生Live Crash

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

所以我该如何解决这个问题?因为我可以使用它来获得所有其他变量与此方法。

2 个答案:

答案 0 :(得分:0)

问题的一个可能原因是在current被调用之前尚未构建getVector。在C ++中初始化静态对象是一个棘手的领域,也是错误的常见来源 - 有关更多信息,请参阅this questionthe static initialization order fiasco FAQ entry

此问题的一个简单解决方案是通过函数提供对current的访问,即替换

static QVector<Coordinates> current;

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

但请注意,上面写的函数不是线程安全的。如果多个线程可能会调用getCurrent,则应使用QMutex保护它。

答案 1 :(得分:0)

对于gareth和论坛:

标题:

typedef  QVector<Coordinates> VesselCoordinates;

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

稍后我将tis函数指针绑定到静态函数(因为我的程序的这部分将是一天转换为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的