小编was*_*ful的帖子

factory,unique_ptr和static_cast

考虑具有基础对象,派生接口和最终对象的多态类:

// base object

struct object
{
    virtual ~object() = default;
};

// interfaces derived from base object

struct interface1 : object
{
    virtual void print_hello() const = 0;

    template<typename T>
    static void on_destruction(object* /*ptr*/)
    {
        std::cout << "interface1::on_destruction" << std::endl;
    }
};

// final object

struct derived1 : interface1
{
    virtual void print_hello() const override
    {
        std::cout << "hello" << std::endl;
    }

    static std::string get_type_name()
    {
        return "derived1";
    }
};
Run Code Online (Sandbox Code Playgroud)

在实际用例中,最终对象是通过插件系统定义的,但这不是重点.请注意,我希望能够on_destruction在对象被销毁时进行调用(参见register_object下文).我想使用这些类如下:

int main()
{
    // …
Run Code Online (Sandbox Code Playgroud)

c++ c++11

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

为什么编译器强制将此转换强制转换为bool值?

我正在使用以下代码片段测试[expr.static.cast]/2(请参阅实例):

#include <iostream>
struct B{ int i = 2; };
struct D: public B{};
int main()
{
    D d;
    std::cout << &d << '\n';
    std::cout << &(static_cast<D&>((B&)d)) << '\n';
    std::cout << &(static_cast<const D&>((B&)d)) << '\n';
    std::cout << &(static_cast<const volatile D&>((B&)d)) << '\n';
}
Run Code Online (Sandbox Code Playgroud)

输出是:

0x7fff65a8f6d0
0x7fff65a8f6d0
0x7fff65a8f6d0
1
Run Code Online (Sandbox Code Playgroud)

在gcc中出现以下警告:

main.cpp: In function 'int main()':
main.cpp:13:57: warning: the address of 'd' will always evaluate as 'true' [-Waddress]
     std::cout << &(static_cast<const volatile D&>((B&)d)) << '\n';
Run Code Online (Sandbox Code Playgroud)

为什么编译器将下面的最后一次转换强制为bool值?

c++ static-cast c++14

8
推荐指数
0
解决办法
106
查看次数

提交到GIT之前的代码格式

根据我的理解,当两个开发人员在同一个项目上工作,但使用不同的编码风格时,GIT中没有内置的方法来统一提交的源.如果我错了,请纠正我.

我应该要求所有开发人员使用相同的样式格式化代码吗?

我可以要求GIT以某种方式根据相同的样式格式化代码吗?是否可以使用BitBucket实现自动代码格式?

git code-formatting bitbucket

8
推荐指数
2
解决办法
5972
查看次数

使用openCV阅读视频

我有一个视频engine2.avi,我想用openCV阅读和展示.这是我的代码:

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>

using namespace cv;

int main(int argc, char** argv)
{
    string filename = "D:\\BMDvideos\\engine2.avi";
    VideoCapture capture(filename);
    Mat frame;

    if( !capture.isOpened() )
        throw "Error when reading steam_avi";

    namedWindow("w", 1);
    for( ; ; )
    {
        capture >> frame;
        //if(!frame)
        //    break;
        imshow("w", frame);
        waitKey(20); // waits to display frame
    }
    waitKey(0);
}
Run Code Online (Sandbox Code Playgroud)

如果我的文件有编解码器YUV 4:2:2 (UYVY)(我使用Direct-Show录制视频),此代码不起作用,但是当我使用视频时,我可以使用openCV!

有谁知道这是如何工作的?

更新:

在阅读了一些链接后,建议捕获异常将解决问题,我修改了我的代码.它没有帮助,但这里是修改后的代码:

cv::VideoCapture cap("d:\\BMDvideos\\engine2.avi");
cv::Mat frame;

try
{
    cap >> frame;
}
catch(cv::Exception ex)
{
    std::cout …
Run Code Online (Sandbox Code Playgroud)

c++ opencv directshow video-processing video-streaming

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

使用CMake创建Qt翻译文件

当我试图在CMake过程中添加生成翻译的过程时,我遇到了问题.

现在我有以下CMakeLists.txt:

configure_file(${CMAKE_CURRENT_SOURCE_DIR}/defines.h.cmake
               ${CMAKE_CURRENT_BINARY_DIR}/defines.h)

file(GLOB_RECURSE UI_FILES *.ui)
file(GLOB_RECURSE CODE_FILES *.cpp)

qt5_wrap_ui(UI_HEADERS ${UI_FILES})

# Qt5LinguistTools
find_package(Qt5LinguistTools)
FILE(GLOB TS_FILES "${CMAKE_CURRENT_SOURCE_DIR}/../resources/langs/*.ts")
QT5_create_translation(QM_FILES ${CODE_FILES} ${TS_FILES})

# Resources
qt5_add_resources(RESOURCE_FILES ../resources/resources.qrc)

# Windows application icon
if (WIN32)
  set(WINDOWS_RES_FILE ${CMAKE_CURRENT_BINARY_DIR}/resources.obj)
  if (MSVC)
    add_custom_command(OUTPUT ${WINDOWS_RES_FILE}
      COMMAND rc.exe /fo ${WINDOWS_RES_FILE} resources.rc
      WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/cmake/win
    )
  else()
    add_custom_command(OUTPUT ${WINDOWS_RES_FILE}
      COMMAND windres.exe resources.rc ${WINDOWS_RES_FILE}
      WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/cmake/win
    )
  endif()
endif()

#Move Qm files to resources langs folder
install(FILES ${QM_FILES} DESTINATION ${CMAKE_INSTALL_PREFIX}/../resources/langs)

add_executable(${CMAKE_PROJECT_NAME} WIN32
  ${QM_FILES}
  ${UI_HEADERS}
  ${CODE_FILES}
  ${RESOURCE_FILES}
  ${WINDOWS_RES_FILE}
)
target_link_libraries(${CMAKE_PROJECT_NAME}
  Qt5::Widgets
  QtAwesome
) …
Run Code Online (Sandbox Code Playgroud)

c++ qt cmake qt5

7
推荐指数
2
解决办法
3632
查看次数

在构建时部署所有Qt依赖项

我创建了一个CMakeLists.txt用于创建一个简单的Qt应用程序(实际上它只有一个main.cpp显示空主窗口的文件):

cmake_minimum_required (VERSION 3.7.0)

project(guitest)

set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)

find_package(Qt5Widgets REQUIRED)
include_directories (${CMAKE_SOURCE_DIR}/src ${CMAKE_CURRENT_SOURCE_DIR})
file (GLOB_RECURSE WSIMGUI_SRC *.cpp)

add_executable(${PROJECT_NAME} ${WSIMGUI_SRC})
target_link_libraries(${PROJECT_NAME} Qt5::Widgets)
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:Qt5::Widgets> $<TARGET_FILE_DIR:${PROJECT_NAME}>)
Run Code Online (Sandbox Code Playgroud)

项目构建并将文件add_custom_command复制Qt5Widgets.dll到输出目录.但是当我尝试运行该程序时,我收到以下错误:

此应用程序无法启动,因为它无法在""中找到或加载Qt平台插件"windows".

我一直在寻找这个问题,我注意到我还必须platform从我的Qt安装中复制该文件夹.

我怎么能在我的CMakeLists.txt文件中这样做?

windows deployment qt cmake qt5

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

find_package 找不到属于 CMake 一部分的 GTest

我想GTest通过以下方式找到:

find_package(GTest REQUIRED)
Run Code Online (Sandbox Code Playgroud)

但没有找到:

错误:找不到 GTest(缺少:GTEST_LIBRARY GTEST_INCLUDE_DIR GTEST_MAIN_LIBRARY)

我从这个链接知道应该GTest通过标准 CMake 分发。

你能告诉我我做错了什么吗?

c++ cmake googletest

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

将三维数组传递给C中的函数

我用来编程FORTRAN,但我决定学习CC++.我从C语言开始,我从未使用的一件事是指针,因为FORTRAN通过引用传递值.我构建了下面的示例代码,以了解指针如何与多维数组一起使用:

#include <stdio.h>
#include <stdlib.h> 

#define DIM1 3
#define DIM2 2 
#define DIM3 4

void display3DArray1(int, int , int n, int (*arr)[][n]);
void display3DArray2(int rows, int cols1, int cols2,int arr[][cols1][cols2]);

int main(void)
{
    int matrix3D[DIM1][DIM2][DIM3] = {
        {{1, 2, 3, 4}, {5, 6, 7, 8}},
        {{9, 10, 11, 12}, {13, 14, 15, 16}},
        {{17, 18, 19, 20}, {21, 22, 23, 24}}
    };
    int (*pmatrix3D)[DIM2][DIM3] = matrix3D;

    display3DArray1(DIM1, DIM2, DIM3,pmatrix3D); 
    display3DArray2(DIM1, …
Run Code Online (Sandbox Code Playgroud)

c arrays

6
推荐指数
1
解决办法
239
查看次数

Qt - 没有匹配函数来调用'QVariant :: QVariant(MyClass&)'

我在创建QVariant自定义类型时遇到问题.这是一个小例子,展示了我想要实现的目标:

main.cpp中:

#include "MyClass.h"

int main() {
  MyClass some_object;
  QVariant variant(some_object);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

包括/ MyClass.h:

#pragma once

#include <QtCore>

class MyClass {
public:
  MyClass() : _my_member(0.0) {}

  MyClass(const MyClass &other) { _my_member = other._my_member; }

  ~MyClass() {}

  MyClass& operator=(MyClass& other)
  {
    swap(*this, other);
    return *this;
  }

  MyClass(MyClass&& other) : MyClass()
  {
    swap(*this, other);
  }

  friend void swap(MyClass& first, MyClass& second)
  {
    using std::swap;
    swap(first._my_member, second._my_member);
  }

private:
  float _my_member;
};
Q_DECLARE_METATYPE(MyClass);
Run Code Online (Sandbox Code Playgroud)

构建失败,并出现以下错误:

error: no matching function for …
Run Code Online (Sandbox Code Playgroud)

c++ qt c++11

5
推荐指数
2
解决办法
1142
查看次数

禁用单个文件的预编译头

我正在处理一个包含许多.cpp文件的项目vs2013,并为它们使用预编译的头文件。我正在使用 CMake 来构建我的项目。

但是我有一个.c文件(我们称之为xyz.c),我想为其禁用预编译头。

我尝试了几种方法,但是如果我为所有.cpp文件启用预编译头,它.c也会自动为该文件打开。这是我尝试过的:

set_source_files_properties (xyz.c
  PROPERTIES COMPILE_FLAGS /Y-xyz.c )
Run Code Online (Sandbox Code Playgroud)

假设/Yu所有文件都打开了,我只是尝试关闭xyz.c.

如果有人知道任何方法,请告诉我。

c c++ cmake visual-c++

5
推荐指数
2
解决办法
2461
查看次数