考虑具有基础对象,派生接口和最终对象的多态类:
// 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) 我正在使用以下代码片段测试[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值?
根据我的理解,当两个开发人员在同一个项目上工作,但使用不同的编码风格时,GIT中没有内置的方法来统一提交的源.如果我错了,请纠正我.
我应该要求所有开发人员使用相同的样式格式化代码吗?
我可以要求GIT以某种方式根据相同的样式格式化代码吗?是否可以使用BitBucket实现自动代码格式?
我有一个视频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) 当我试图在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) 我创建了一个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文件中这样做?
我想GTest通过以下方式找到:
find_package(GTest REQUIRED)
Run Code Online (Sandbox Code Playgroud)
但没有找到:
错误:找不到 GTest(缺少:GTEST_LIBRARY GTEST_INCLUDE_DIR GTEST_MAIN_LIBRARY)
我从这个链接知道应该GTest通过标准 CMake 分发。
你能告诉我我做错了什么吗?
我用来编程FORTRAN,但我决定学习C和C++.我从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) 我在创建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) 我正在处理一个包含许多.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++ ×7
cmake ×4
qt ×3
c ×2
c++11 ×2
qt5 ×2
arrays ×1
bitbucket ×1
c++14 ×1
deployment ×1
directshow ×1
git ×1
googletest ×1
opencv ×1
static-cast ×1
visual-c++ ×1
windows ×1