我是一般编程的新手,所以我决定从C++中创建一个简单的向量类开始.但是我想从一开始就养成良好的习惯,而不是稍后尝试修改我的工作流程.
我目前只有两个文件vector3.hpp和vector3.cpp.随着我对一切事物越来越熟悉,这个项目将慢慢开始增长(使其更像是一般的线性代数库),因此我希望采用"标准"项目布局,以便以后更轻松.所以在环顾四周后,我发现了两种组织hpp和cpp文件的方法,第一种方法是:
project
??? src
??? vector3.hpp
??? vector3.cpp
Run Code Online (Sandbox Code Playgroud)
第二个是:
project
??? inc
? ??? project
? ??? vector3.hpp
??? src
??? vector3.cpp
Run Code Online (Sandbox Code Playgroud)
你会推荐哪个?为什么?
其次,我想使用Google C++测试框架对我的代码进行单元测试,因为它看起来相当容易使用.你认为在我的代码捆绑这一点,例如inc/gtest或contrib/gtest文件夹?如果捆绑了,您是否建议使用fuse_gtest_files.py脚本来减少数量或文件,或保留原样?如果没有捆绑,这个依赖是如何处理的?
在编写测试时,这些测试通常是如何组织的?我想为每个类创建一个cpp文件(test_vector3.cpp例如),但是所有编译成一个二进制文件,以便它们可以轻松地一起运行?
由于gtest库通常是使用cmake和make构建的,所以我认为我的项目也可以像这样构建吗?如果我决定使用以下项目布局:
??? CMakeLists.txt
??? contrib
? ??? gtest
? ??? gtest-all.cc
? ??? gtest.h
??? docs
? ??? Doxyfile
??? inc
? ??? project
? ??? vector3.cpp
??? src
? ??? vector3.cpp
??? test
??? test_vector3.cpp
Run Code Online (Sandbox Code Playgroud)
如何CMakeLists.txt才能看到它只能构建库或库和测试?我也见过很多有a build和a …
我试图扭转所给出的索引,enumerate同时保留列举的列表的原始顺序.
假设我有以下内容:
>> range(5)
[0, 1, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud)
如果我列举这个,我会得到以下内容:
>> list(enumerate(range(5)))
[(0, 0), (1, 1), (2, 2), (3, 3), (4, 4)]
Run Code Online (Sandbox Code Playgroud)
但是我想要反转枚举提供的索引,以便得到:
[(4, 0), (3, 1), (2, 2), (1, 3), (0, 4)]
Run Code Online (Sandbox Code Playgroud)
到目前为止,我有以下代码:
reversed(list(enumerate(reversed(range(5)))))
Run Code Online (Sandbox Code Playgroud)
我只是想知道是否有更简洁的方法来做到这一点?
在C++ Core Guidlines P.1 change_speed示例中,它显示了一个Speed使用的类型,如下所示:
change_speed(Speed s); // better: the meaning of s is specified
// ...
change_speed(2.3); // error: no unit
change_speed(23m / 10s); // meters per second
Run Code Online (Sandbox Code Playgroud)
我对这个例子的最后两行特别感兴趣.第一个似乎暗示如果你没有提供带有参数的单位change_speed就会抛出一个错误.最后一行显示使用一些m和s文字定义的单位.现代版C++中是否都有这些新功能?如果是这样,将如何实现这样的东西,以及需要什么版本的C++?
我有一个具有以下结构的项目:
linalg
??? build
??? CMakeLists.txt
??? docs
? ??? Doxyfile
??? include
? ??? linalg
? ??? vector3.hpp
??? src
? ??? CMakeLists.txt
? ??? linalg
? ??? vector3.cpp
??? test
??? CMakeLists.txt
??? linalg
??? test_vector3.cpp
Run Code Online (Sandbox Code Playgroud)
文件test_vector3.cpp是一个gtest单元测试文件,它提供了两个简单的测试.顶级CMakeLists.txt只是设置包含并添加src和test子目录:
cmake_minimum_required(VERSION 2.8)
project(linalg)
include_directories(include)
add_subdirectory(src)
add_subdirectory(test)
Run Code Online (Sandbox Code Playgroud)
src/CMakeLists.txt文件将vector3.cpp编译为静态库:
cmake_minimum_required(VERSION 2.8)
add_library(linalg linalg/vector3.cpp)
Run Code Online (Sandbox Code Playgroud)
test/CMakeLists.txt文件基于/usr/share/cmake-2.8/Modules/FindGTest.cmake中提供的示例:
cmake_minimum_required(VERSION 2.8)
enable_testing()
find_package(GTest REQUIRED)
include_directories(${GTEST_INCLUDE_DIRS})
add_executable(test_vector3 linalg/test_vector3.cpp)
target_link_libraries(test_vector3 linalg ${GTEST_BOTH_LIBRARIES} pthread)
add_test(test_vector3 test_vector3)
Run Code Online (Sandbox Code Playgroud)
然后我运行以下内容:
cd build
cmake ..
make
Run Code Online (Sandbox Code Playgroud)
我将liblinalg.a库正确编译到build/src中,并在构建/测试中正确编译了test_vector3可执行文件.我可以运行test_vector3可执行文件,我从googletest获得输出,说所有测试都已通过,但是如果我运行make test我没有输出任何输出,如果我运行,ctest ..我得到一条消息说:
Test project …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用matplotlib在此页面上重新创建图表:http://books.google.co.uk/books? id = sf9Qn9MS0ykC&p = PA18
这是我到目前为止:
import numpy as np
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib.patches import FancyArrowPatch
from mpl_toolkits.mplot3d import proj3d
class Arrow3D(FancyArrowPatch):
def __init__(self, xs, ys, zs, *args, **kwargs):
FancyArrowPatch.__init__(self, (0,0), (0,0), *args, **kwargs)
self._verts3d = xs, ys, zs
def draw(self, renderer):
xs3d, ys3d, zs3d = self._verts3d
xs, ys, zs = proj3d.proj_transform(xs3d, ys3d, zs3d, renderer.M)
self.set_positions((xs[0],ys[0]),(xs[1],ys[1]))
FancyArrowPatch.draw(self, renderer)
def Rx(phi):
return np.array([[1, 0, 0],
[0, np.cos(phi), -np.sin(phi)],
[0, …Run Code Online (Sandbox Code Playgroud) 我正在编写一个简单的向量类,我希望有一些成员函数只能在某些长度的向量中使用(例如,3元素向量的交叉乘积).我偶然发现了std :: enable_if,看起来它可能能够做我想要的,但我似乎无法让它正常工作.
#include <iostream>
#include <type_traits>
template<typename T, unsigned int L>
class Vector
{
private:
T data[L];
public:
Vector<T,L>(void)
{
for(unsigned int i = 0; i < L; i++)
{
data[i] = 0;
}
}
T operator()(const unsigned int i) const
{
return data[i];
}
T& operator()(const unsigned int i)
{
return data[i];
}
Vector<typename std::enable_if<L==3, T>::type, L> cross(const Vector<T,L>& vec2) const
{
Vector<T,L> result;
result(0) = (*this)(1) * vec2(2) - (*this)(2) * vec2(1);
result(1) = (*this)(2) * vec2(0) …Run Code Online (Sandbox Code Playgroud) 我有一个类,它基本上是一个double的包装器,允许它的值被强制为静态值:
class ModelParameter
{
protected:
double val;
bool isForced;
double forcedVal;
public:
ModelParameter(void);
ModelParameter(double value);
double getValue(void);
void setValue(double value);
bool getIsForced(void);
void forceValue(double value);
void unforceValue(void);
};
Run Code Online (Sandbox Code Playgroud)
但我希望能够将它用于任何原始类型,而不仅仅是双打.如果我像这样重新定义它:
template <class T>
class ModelParameter
{
protected:
T val;
bool isForced;
T forcedVal;
public:
ModelParameter(void);
ModelParameter(T value);
T getValue(void);
void setValue(T value);
bool getIsForced(void);
void forceValue(T value);
void unforceValue(void);
};
Run Code Online (Sandbox Code Playgroud)
这意味着可以使用任何类型,无论它是否是原始的.有没有什么办法可以限制模板中使用的类型只使用原始类型?
我知道代码生成和doxygen支持等功能通常被认为是商业性的,但我想知道是否有任何支持c ++代码生成的免费UML工具支持doxygen文档?
生成带有文档的模型非常有用,而不必重复/编辑它以启用doxygen支持.
编辑:忘了提我在Linux下开发(Ubuntu)
设置BS3 input-group-addon元素的宽度时,我遇到了一些麻烦,这些元素都是前置并附加到文本输入的.在这种情况下,input-group-addon元素的宽度设置正确,但文本输入的宽度不再填充容器的宽度.但是,如果这些只是一个前置或附加的输入组插件,设置宽度按预期工作,请参阅http://jsfiddle.net/asZXU/作为示例.
如何设置BS3 input-group-addon元素的宽度,这些元素已经预先添加到文本输入并附加到文本输入,并且文本输入仍然填充容器的剩余宽度?
注意:我只style="width: 55px;在小提琴中设置input-group-addon元素的宽度,以便能够演示所有变体.我希望能够通过以下方式设置宽度:
.input-group-addon {
width: 55px;
}
Run Code Online (Sandbox Code Playgroud) 我想尝试在C ++ 17的新的文件系统库,因此试图复制从cppreference.com的std ::文件系统::例子的current_path并使用最新版本(16.0)编译它MinGW的分布从nuwen.net上我的Windows 10 x64计算机。其中包括gcc v8.1,根据cppreference.com编译器支持页面,该文件应支持文件系统库。
这是我要编译的代码:
#include <iostream>
#include <filesystem>
namespace fs = std::filesystem;
int main()
{
std::cout << "Current path is " << fs::current_path() << '\n';
}
Run Code Online (Sandbox Code Playgroud)
和我正在使用的编译器命令:
g++ -std=c++17 filesystem_test.cpp
Run Code Online (Sandbox Code Playgroud)
这是我尝试编译时遇到的错误:
In file included from c:\mingw\include\c++\8.1.0\filesystem:37,
from filesystem_test.cpp:2:
c:\mingw\include\c++\8.1.0\bits\fs_path.h: In member function 'std::filesystem::__cxx11::path& std::filesystem::__cxx11::path::operator/=(const std::filesystem::__cxx11::path&)':
c:\mingw\include\c++\8.1.0\bits\fs_path.h:237:47: error: no match for 'operator!=' (operand types are 'std::filesystem::__cxx11::path' and 'std::filesystem::__cxx11::path')
|| (__p.has_root_name() && __p.root_name() != root_name()))
~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~
In file included from c:\mingw\include\c++\8.1.0\iosfwd:40,
from …Run Code Online (Sandbox Code Playgroud) c++ ×6
cmake ×2
doxygen ×2
googletest ×2
python ×2
c++17 ×1
ctest ×1
enable-if ×1
enumerate ×1
gcc8 ×1
matplotlib ×1
mingw-w64 ×1
mplot3d ×1
python-3.x ×1
reverse ×1
templates ×1
uml ×1
windows-10 ×1