小编Aer*_*ius的帖子

使用类类型向量的前向声明 - 不允许指向不完整类类型的指针

我有两节课,foobar.

foo.h #includes bar.h并包含一个std::vector指向bar对象的指针.在运行时期间的某个时刻,bar必须访问指向其他bar对象的指针向量.因此,foo包含一个getBarObjects()返回指针数组的方法.

因此,我foo在bar.h中转发声明.我显然还要转发声明我正在使用的方法 - foo::getBarObjects().当这返回指针数组时bar,我陷入了恶性循环.

我无法转发声明Bar然后只是转发声明getBarObjects(),因为这导致"不允许不完整的类型名称".

foo.h中:

#include "bar.h"
#include <vector>

class foo {
    public:
         foo();
         ~foo();
         std::vector<bar*> getBarObjects();
    private:
         std::vector<bar*> barObjects;
}
Run Code Online (Sandbox Code Playgroud)

bar.h:

class foo;
std::vector<bar*> foo::getBarObjects();        // error, doesn't know bar at this point

class bar {
    public:
        bar(foo *currentFoo);
        ~bar();
        bool dosth();
    private:
        foo *thisFoo;
}
Run Code Online (Sandbox Code Playgroud)

bar.cpp:

#include "bar.h"

bool bar(foo …
Run Code Online (Sandbox Code Playgroud)

c++ circular-dependency forward-declaration

11
推荐指数
2
解决办法
6764
查看次数

植绒算法在200多个boids上崩溃

我正在研究将植绒算法应用到更大的系统中.OGRE用于渲染,luabind用于能够从LUA,yatta yatta进行通信,这些东西不应该太重要.

我基本上按雷诺'boids-model实现了算法.这意味着,一个Boid(如"群中的一条鱼")根据它在某个半径内的邻居移动.事情就是这样,它的基本复杂性是O(n²),因为如果它们在范围内,每个boid都必须检查所有它们的flockmates,然后考虑一些因素来计算自己的运动.

算法本身实现并运行顺畅.它接受所有不同尺寸的模型,它可以在2D和3D空间中工作,它很好吃,我已经有一段时间了.

我的问题是,当我在boid数字中遇到一种"障碍"时,算法会在运行时崩溃,大约200-250甚至变化.现在,如果它变得越来越慢,直到我被打破到1 fps,我就能理解,算法的简单性能就是问题所在.但是,例如,199 boids完美运行,201根本不工作并且在运行时崩溃.这对我来说非常令人惊讶.

我实现了两个类:"Swarm"和"Boid".Swarm用于保存指向swarm的所有boid的指针,但计算不多,在Boid中发生移动.

swarm.h:

#ifndef __SWARM_H__
#define __SWARM_H__

#include <vector>
#include "boid.h"

namespace Core {

    class swarm {

    public:
    swarm();
    ~swarm();
    bool move(float timeSinceLastFrame);
    bool addBoid(boid *thisBoid);
    bool removeBoidByName(std::string boidName);
    bool writeAllBoidNames();
    std::vector<boid*> getFlockMates();

private:
    std::vector<boid*> flock;
    float timePassed;

};

}


#endif
Run Code Online (Sandbox Code Playgroud)

boid.h:

#ifndef __BOID_H__
#define __BOID_H__

#include "Ogre.h"
#include <vector>
#include <stdlib.h>

namespace Core {

class swarm;

class boid {

    public:
        boid(Ogre::SceneNode *thisNode, Ogre::String orientation, swarm *thisSwarm);            // Constructor - direkter Node-Zugriff
        boid(Ogre::MovableObject *thisObject, …
Run Code Online (Sandbox Code Playgroud)

c++

9
推荐指数
1
解决办法
3443
查看次数

QNetworkAccessManager - 第一次GET非常慢

我在Android上的Qt 5.5中使用QNetworkAccessManager时遇到问题.通过http GET下载一个简单的小图形文件会导致很多垃圾收集调用,并在此期间锁定UI.随后的GET可以完美地工作,没有这些GC调用.代码如下:

void DownloadManager::downloadFile(QUrl fromUrl, QString toFilePath) {

    _currentFilePath = toFilePath;

    QNetworkRequest request;
    request.setUrl(fromUrl);

    qDebug() << "before";

    _currentReply = _mgr.get(request);

    qDebug() << "after";

    connect(_currentReply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(downloadError(QNetworkReply::NetworkError)));
    connect(_currentReply, SIGNAL(downloadProgress(qint64, qint64)), this, SLOT(downloadProgress(qint64,qint64)));
    connect(_currentReply, SIGNAL(finished()), this, SLOT(downloadFinished()));

}
Run Code Online (Sandbox Code Playgroud)

DownloadManager是一个自定义的QObject派生类,没有任何与get请求相关的特殊功能._mgr是在DownloadManagers cTor期间分配的QNetworkAccessManager对象.

正如您所看到的,这只是一个获取请求的教科书示例,没有什么太花哨的.正如我所说:它在大多数情况下都有效.只有第一个get请求最终会像这样:

D/ .../downloadmanager.cpp:61 (void DownloadManager::downloadFile(QUrl, QString)): before
D/dalvikvm(13298): GC_CONCURRENT freed 2290K, 25% free 10911K/14407K, paused 2ms+3ms, total 29ms
D/dalvikvm(13298): GC_CONCURRENT freed 501K, 25% free 10884K/14407K, paused 13ms+2ms, total 35ms
D/dalvikvm(13298): GC_CONCURRENT freed 524K, 25% free 10892K/14407K, paused …
Run Code Online (Sandbox Code Playgroud)

c++ qt android qnetworkaccessmanager

7
推荐指数
1
解决办法
613
查看次数