小编use*_*303的帖子

避免在类头文件中声明私有函数(C++)

(在C++中)我有一个类,其结构在头文件中声明.该头文件包含在许多源文件中,因此当我编辑它时,我需要重新编译大量文件.

该类有一组私有函数,只在一个源文件中调用.目前,它们在头文件的类结构中声明.当我添加这种类型的新函数或编辑参数时,它会导致重新编译大量文件.我想在其他地方声明这些函数,这样只会重新编译定义和调用它们的文件(以节省时间).但是,他们仍然需要能够访问内部类变量.

我怎样才能做到这一点?

c++ private header function declare

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

Julia:带抽象参数的数组会导致错误,但抽象类型的变量则不会

朱莉娅风格指南说以下内容:

不要使用不必要的静态参数.功能签名:

foo{T<:Real}(x::T) = ...
Run Code Online (Sandbox Code Playgroud)

应该写成:

foo(x::Real) = ...
Run Code Online (Sandbox Code Playgroud)

我希望也适用于数组参数.但是,如果我写下面的代码:

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会为具有抽象类型参数的数组抛出错误,而对于具有抽象类型的变量则不会?

julia

14
推荐指数
1
解决办法
678
查看次数

创建一个固定大小的std :: vector并写入元素

在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 :: …

c++ arrays const stdvector dynamic-arrays

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

将特征仿射变换转换为特征等距变换

使用特征库将仿射变换转换为等距变换(即仅由旋转和平移组成)的最简单方法是什么?

两种转换都是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++ transform eigen

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

我应该使用什么C++ STL类来减少由大量小分配引起的碎片?

我的C++类随着时间的推移构建了一个树结构.树中的每个节点当前都在构造上分配(使用new).节点类仅使用几个字节的内存.随着树的增长,可能有10万个节点; 除了理论上的最大值2 ^ 33之外,在构造树时不知道最大节点数.我通过指针引用树结构中的节点.所有节点在销毁树时都会被释放,然后才会被解除分配.

我正在使用标准库容器或内存分配器/池,我可以使用它来分配和存储我的树类中的节点,以减少内存碎片和内存分配开销.我想避免编写自定义分配器.容器应具有以下两个属性:

  1. 分配的对象不会在内存中移动,因此可以安全地通过指针引用.
  2. 该类为大块对象分配内存,从而减少内存碎片.请注意,我要求整个容器在内存中是连续的.

我不需要容器的迭代器或查找功能,因为我的树结构存储指针.什么标准库类将为我提供此功能,并给我最低的内存开销?

c++ containers memory-management stl c++11

4
推荐指数
2
解决办法
1889
查看次数

包含特征向量的类的奇怪大小

包含两个特征向量的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 …

c++ sizeof padding memory-alignment eigen

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