(在C++中)我有一个类,其结构在头文件中声明.该头文件包含在许多源文件中,因此当我编辑它时,我需要重新编译大量文件.
该类有一组私有函数,只在一个源文件中调用.目前,它们在头文件的类结构中声明.当我添加这种类型的新函数或编辑参数时,它会导致重新编译大量文件.我想在其他地方声明这些函数,这样只会重新编译定义和调用它们的文件(以节省时间).但是,他们仍然需要能够访问内部类变量.
我怎样才能做到这一点?
该朱莉娅风格指南说以下内容:
不要使用不必要的静态参数.功能签名:
Run Code Online (Sandbox Code Playgroud)foo{T<:Real}(x::T) = ...应该写成:
Run Code Online (Sandbox Code Playgroud)foo(x::Real) = ...
我希望也适用于数组参数.但是,如果我写下面的代码:
ret1(x::Real) = x
ret2(x::Array{Float64,2}) = x
ret3(x::Array{Real,2}) = x
ret1(1.0)
ret2(rand(2,2))
ret3(rand(2,2))
Run Code Online (Sandbox Code Playgroud)
然后我得到以下控制台输出(使用Julia 0.2.1):
MethodError(ret3,(
2x2 Array{Float64,2}:
0.841121 0.322133
0.469432 0.495438,))
Run Code Online (Sandbox Code Playgroud)
那么为什么Julia会为具有抽象类型参数的数组抛出错误,而对于具有抽象类型的变量则不会?
在C++中,我希望分配一个固定大小(但在运行时确定的大小)std :: vector然后写入此向量中的元素.这是我正在使用的代码:
int b = 30;
const std::vector<int> test(b);
int &a = test[3];
Run Code Online (Sandbox Code Playgroud)
但是,这给了我一个编译器(MSVC 2010 Pro)错误:
错误C2440:'initializing':无法从'const int'转换为'int&'.转换失去限定符.
我对const的理解是它使一个类的所有成员变量保持不变.例如,以下工作正常:
class myvec
{
public:
myvec(int num) : ptr_m(new int[num]) {};
~myvec() { delete ptr_m; }
void resize(int num) { delete ptr_m; ptr_m = new int[num]; }
int & operator[] (int i) const { return ptr_m[i]; }
int *ptr_m;
};
const myvec test(30);
int &a = test[3]; // This is fine, as desired
test.resize(10); // Error here, as expected
Run Code Online (Sandbox Code Playgroud)
因此,似乎std :: …
使用特征库将仿射变换转换为等距变换(即仅由旋转和平移组成)的最简单方法是什么?
两种转换都是3D.仿射矩阵对于左上象限具有一般的3×3矩阵(即旋转,缩放和剪切),而等轴测量对于相同象限具有3×3旋转矩阵,因此需要投影.
Eigen::AffineCompact3f a;
Eigen::Isometry3f b(a);
Run Code Online (Sandbox Code Playgroud)
给出编译错误:
错误C2338:YOU_PERFORMED_AN_INVALID_TRANSFORMATION_CONVERSION
同时
Eigen::AffineCompact3f a;
Eigen::Isometry3f b(a.rotation(), a.translation());
Run Code Online (Sandbox Code Playgroud)
给
(第2行)错误C2661:'Eigen :: Transform <_Scalar,_Dim,_Mode> :: Transform':没有重载函数需要2个参数
和
Eigen::AffineCompact3f a;
Eigen::Isometry3f b;
b.translation() = a.translation();
b.rotation() = a.rotation();
Run Code Online (Sandbox Code Playgroud)
给
(第4行)错误C2678:二进制'=':找不到运算符,它接受类型'const Eigen :: Matrix <_Scalar,_Rows,_Cols>'的左手操作数(或者没有可接受的转换)
给定rotation()和translation()函数,问题可以改为"我如何最好地设置等距变换的旋转和平移组件?"
我的C++类随着时间的推移构建了一个树结构.树中的每个节点当前都在构造上分配(使用new).节点类仅使用几个字节的内存.随着树的增长,可能有10万个节点; 除了理论上的最大值2 ^ 33之外,在构造树时不知道最大节点数.我通过指针引用树结构中的节点.所有节点在销毁树时都会被释放,然后才会被解除分配.
我正在使用标准库容器或内存分配器/池,我可以使用它来分配和存储我的树类中的节点,以减少内存碎片和内存分配开销.我想避免编写自定义分配器.容器应具有以下两个属性:
我不需要容器的迭代器或查找功能,因为我的树结构存储指针.什么标准库类将为我提供此功能,并给我最低的内存开销?
包含两个特征向量的C++类具有奇怪的大小.我的问题MWE在这里:
#include <iostream>
#include "Eigen/Core"
class test0 {
Eigen::Matrix<double,4,1> R;
Eigen::Matrix<double,4,1> T;
};
class test1 {
Eigen::Matrix<double,4,1> R;
Eigen::Matrix<double,3,1> T;
};
class test2 {
Eigen::Matrix<double,4,1> R;
Eigen::Matrix<double,2,1> T;
};
class test3 {
Eigen::Matrix<double,7,1> T;
};
class test4 {
Eigen::Matrix<double,3,1> T;
};
int main(int argc, char *argv[])
{
std::cout << sizeof(test0) << ", " << sizeof(test1) << ", " << sizeof(test2) << ", " << sizeof(test3) << ", " << sizeof(test4) << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我在我的系统上得到的输出(MacBook Pro,Xcode Clang ++编译器)是:
64,64,48,56,24 …