小编Pri*_*tic的帖子

私有和受保护的纯虚函数之间有什么区别吗?

我可以理解,可能有理由声明一个已实现(而不是纯粹)的私有或受保护的虚拟函数.Afaik,如果您将已实现的虚拟方法声明为受保护,则您的子类可以调用基类的方法(并且没有其他人可以).如果将其声明为private,则只有基类可以调用virtual方法的默认实现.

但是,对于纯虚拟机,没有基本实现......那么在功能上是否等同于将纯虚拟声明为私有或受保护?受保护的纯虚拟没有意义,因为您无法调用基类的相应方法.是否存在受保护的纯虚拟有意义的情况?

SO上有一些类似的主题,但我找不到任何简洁回答我问题的内容.

c++ inheritance pure-virtual

18
推荐指数
2
解决办法
5471
查看次数

在std :: future上多次调用wait()并从多个线程安全吗?

我试图确定什么时候我可以安全地调用wait()std::futurestd::shared_future.我从不打电话get()future,并且通过future调用相应的promise set_value()方法来准备就绪.

我想等这个future(用wait(),wait_for(),wait_until())从多个线程.我也希望调用wait()之后promise::set_value()被调用立即返回.

来自http://www.cplusplus.com/reference/future/future/wait/

在未来的无效对象上调用此成员函数会产生未定义的行为

得到一个futurepromise开头它关闭valid()==true.至于我只能看到future::get()设置valid()为false.这个假设是否正确?我可以随意调用wait()函数族吗?wait()在承诺的价值被设定之后的召唤会立即回归吗?我可以从多个线程调用它们吗?

c++ multithreading c++11

18
推荐指数
1
解决办法
3538
查看次数

在OpenGL中将纹理映射到球体时出现缝隙问题

我正在尝试创建几何体以在OpenGL中表示地球.我有一个或多或少的球体(尽管接近地球的椭圆大地水准面).我绘制了地球表面的纹理(这可能是一个墨卡托投影或类似的东西).纹理的UV坐标对应于几何的纬度和经度.我有两个问题,我无法解决.我正在使用OpenSceneGraph,但我认为这是一个普通的OpenGL/3D编程问题.

  • 有一个非常明显的纹理接缝.我确定这是因为我不知道如何将UV坐标映射到发生接缝的XYZ.我只将UV coords映射到最后一个顶点然后环绕...你需要将两个不同的UV坐标映射到同一个XYZ顶点以消除接缝.是否有一个常用的技巧来解决这个问题,或者我只是做错了?

  • 两极发生疯狂的扭曲变形.我猜这是因为我在极点映射一个UV点(对于地球,我使用[0.5,1]作为北极,而[0.5,0]作为南极).你会做什么呢?我可以接受这个......但是在较低分辨率的网格中它非常明显.

我附上了一张图片来展示我在说什么.

我很害怕渲染地球

c++ opengl geometry

12
推荐指数
1
解决办法
7620
查看次数

使用Clang中具有函数本地类型的模板的类型计数器的意外结果

我根据两种类型编写了一个类模板,根据模板参数分配了一个唯一的索引:

template<typename SK,typename T>
struct Component {
    static uint const index;
};
Run Code Online (Sandbox Code Playgroud)

期望是每个新类型index增加:

Component<X,A>::index; // 0
Component<X,B>::index; // 1

Component<Y,A>::index; // 0
Component<Y,B>::index; // 1
// ...etc
Run Code Online (Sandbox Code Playgroud)

分配索引的完整代码如下:

using uint = unsigned int;

template<typename SK,typename T>
struct Component
{
    static uint const index;
};

template<typename SK>
class ComponentCount
{
    template<typename CSK,typename CT>
    friend struct Component;

private:
    template<typename T>
    static uint next() {
        return ComponentCount<SK>::get_counter();
    }

    static uint get_counter()
    {
        static uint counter = 0;
        return counter++;
    }
}; …
Run Code Online (Sandbox Code Playgroud)

c++ templates clang c++11

12
推荐指数
1
解决办法
215
查看次数

跨平台的'thread_local'的当前支持状态是什么?

我想要总结一下'thread_local'关键字在不同编译器和平台上的当前支持状态.

我对常见的桌面和移动平台特别感兴趣.我可以找到的信息看起来很不稳定,因为有报道称它在某些平台上工作,而不是在其他平台上工作,或者提到支持是WIP.我们欢迎即使对于单一平台也能确认支持(或缺乏支持)的答案.如果有任何警告,请提供支持的任何警告.

  • Windows(gcc,clang,msvc)
  • Linux(gcc,clang)
  • OS X(gcc,clang)
  • Android(gcc,clang)
  • iOS版
  • 黑莓
  • Windows Phone/RT /等

c++ gcc clang visual-c++ c++11

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

Visvalingam-Whyatt折线简化算法澄清

我正在尝试实现折线简化算法.原始文章可以在这里找到:http://archive.is/Tzq2.这似乎在概念简单,但我不明白的样本算法(我认为这是措辞很差)伪提供,希望有人能提供一些见解.从文章中我收集到的基本想法是

  1. 计算每个点的有效面积(由一条线上三个连续点之间的三角形组成),并删除那些面积为0的面积
  2. 从最小区域开始,将点的面积与阈值进行比较,如果该区域低于该阈值,则从折线中删除它.
  3. 移动到两个相邻的点,并在它们发生变化时重新计算它们的区域
  4. 返回2,直到阈值以下的所有点区域都被移除

算法如下(从文章中逐字复制):

  • 计算每个点的有效区域删除零区域的所有点,并将它们存储在该区域的单独列表中
  • 重复
    • 找到效率最小的点,并将其称为当前点.如果计算出的面积小于要消除的最后一个点,则使用后者的区域.(这可确保在不消除先前消除的点的情况下无法消除当前点.)
    • 从原始列表中删除当前点,并将其与其关联区域一起添加到新列表中,以便在运行时过滤该行.
    • 重新计算两个相邻点的有效面积(见图1b).
  • 直到
    • 原始线仅包含2个点,即起点和终点.

我对'REPEAT'下第一步中的'if'条款感到困惑......任何人都可以澄清一下吗?

algorithm simplification polyline

10
推荐指数
2
解决办法
9593
查看次数

无法在QGLWidget中设置所需的OpenGL版本

我正在尝试在Qt 4.8.2中使用QGLWidget.我注意到QGLWidget创建的默认上下文没有显示3.1以上的OpenGL的任何输出.Qt wiki有一个教程,演示如何使用OpenGL 3.3绘制一个简单的三角形.当我尝试运行教程时,我得到一个空白屏幕.如果我将OpenGL版本更改为3.1,我会得到预期的输出(红色三角形).

我的视频卡支持OpenGL 4.2,QGLFormat::openGLVersionFlags()在创建QGLWidget之前调用显示Qt检测到OpenGL 4.2和所有以前的桌面版本.

这是另一个最小的例子:

#include <QApplication>
#include <QGLWidget>
#include <QDebug>
#include <QtDeclarative/qdeclarativeview.h>

int main(int argc, char * argv[])
{
    QApplication app(argc, argv);

    qDebug() << "OpenGL Versions Supported: " << QGLFormat::openGLVersionFlags();

    QGLFormat qglFormat;
    qglFormat.setVersion(4,2);  // get expected output with (3,1) and below, else blank window
    qglFormat.setProfile(QGLFormat::CoreProfile);
    qglFormat.setSampleBuffers(true);

    QGLWidget* qglWidget = new QGLWidget(qglFormat);

    QString versionString(QLatin1String(reinterpret_cast<const char*>(glGetString(GL_VERSION))));
    qDebug() << "Driver Version String:" << versionString;
    qDebug() << "Current Context:" << qglWidget->format();

    QDeclarativeView mainView;
    mainView.setViewport(qglWidget);
    mainView.setSource(QString("helloworld.qml"));
    mainView.show(); …
Run Code Online (Sandbox Code Playgroud)

c++ opengl qt opengl-3

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

跨线程从QML调用QObject函数

我正在尝试确定如何从QML中为生活在另一个线程中的QObject调用QObject槽或Q_INVOKABLE方法,以及它是否安全.

假设有一个MainThread和ThreadA.QObjectA位于ThreadA中.QML引擎/ gui/Everys都存在于MainThread中.我将QObjectA暴露给QML引擎

declarativeView->setContextProperty("someObj",ObjectA)
Run Code Online (Sandbox Code Playgroud)

现在在QML文件中,我打电话

someObj.someMethod();
Run Code Online (Sandbox Code Playgroud)

其中someMethod是一个槽或Q_INVOKABLE.我想知道哪个线程实际执行该函数.如果它是MainThread,那将是一件坏事,并且在线程之间调用这样的方法会很危险.如果它是由ThreadA执行的,那么一切都会好的.

基于此文档:http://doc.qt.nokia.com/4.7-snapshot/qtbinding.html,我假设QMetaObject ::的InvokeMethod()用于调用QObject的功能.该文档(http://doc.qt.nokia.com/4.7-snapshot/qmetaobject.html#invokeMethod),显示有可用的不同的连接类型,就像使用Qt信号和槽.

我想知道,如果Qt的QML引擎从QML跨线程调用C++方法时自动地选择合适的类型的情况,如果是这样,要求住在从QML其他线程对象的方法是可以接受的做法.

c++ qt multithreading qml

8
推荐指数
1
解决办法
2583
查看次数

我什么时候需要使用OpenGL函数加载器?

关于何时需要使用像GLEW这样的OpenGL函数加载器,我有点困惑.通常,您似乎首先获得一个窗口和有效的OpenGL上下文,然后尝试加载函数.

  • 有时这些函数被称为扩展,有时它们也被称为核心函数.似乎加载并归类为"核心"和"扩展"的是依赖于平台的.除了一些基本集之外还加载了哪些函数?

  • 您是否还需要在OpenGL ES平台上以相同的方式加载函数?快速浏览GLEW,我没有看到对Open GL ES的明确支持.其他GL函数加载器库明确提到了专门针对ES的支持(例如https://github.com/Dav1dde/glad)

opengl opengl-es

8
推荐指数
1
解决办法
5269
查看次数

为什么make_unique使用可以将std :: bind作为参数的构造函数进行额外的移动?

我有一个简单的类,有一个看起来像这样的构造函数:

Event(std::function<void()> &&f) : m_f(std::move(f)) { }
Run Code Online (Sandbox Code Playgroud)

构造函数可以与std :: bind一起使用:

Thing thing;
std::unique_ptr<Event> ev(new Event(std::bind(some_func,thing)));
Run Code Online (Sandbox Code Playgroud)

以上述方式使用它会导致'thing'的一个副本构造,然后在该副本上移动构造.

但是,执行以下操作:

std::unique_ptr<Event> ev = make_unique<Event>(std::bind(some_func,thing));
Run Code Online (Sandbox Code Playgroud)

结果有两个移动结构.我的问题是:

  • 什么时候调用'thing'上的移动构造函数
  • 为什么用make_unique调用它两次?

这是最小的例子:

#include <iostream>
#include <memory>
#include <functional>
using namespace std;

class Thing
{
public:
    Thing() : x(0)
    {

    }

    Thing(Thing const &other)
    {
        this->x = other.x;
        std::cout << "Copy constructed Thing!\n";
    }

    Thing(Thing &&other)
    {
        this->x = other.x;
        std::cout << "Move constructed Thing!\n";
    }

    Thing & operator = (Thing const &other)
    {
        this->x = other.x;
        std::cout …
Run Code Online (Sandbox Code Playgroud)

c++ c++11 c++14

8
推荐指数
1
解决办法
1536
查看次数