小编SCF*_*nch的帖子

.cpp文件中的C++内联成员函数

我知道按定义,内联成员函数应该进入标题.但是如果不能将函数的实现放入标题呢?让我们来看看这种情况:

档案啊

#pragma once
#include "B.h"

class A{
    B b;
};
Run Code Online (Sandbox Code Playgroud)

文件Bh

#pragma once

class A; //forward declaration

class B{
    inline A getA();
};
Run Code Online (Sandbox Code Playgroud)

由于圆形包括我必须把实施getA

B.cpp

#include "B.h"
#include "A.h"

inline A B::getA(){
    return A();
}
Run Code Online (Sandbox Code Playgroud)

编译器会内联getA吗?如果是这样,哪个内联关键字是重要的(标题中的那个或.cpp文件中的那个)?是否有另一种方法将内联成员函数的定义放入其.cpp文件中?

c++ inline function member

69
推荐指数
4
解决办法
6万
查看次数

在命名空间内使用声明的范围

在C++头文件中是否安全(和正确)以在命名空间中使用using声明,如下所示:

#include <boost/numeric/ublas/vector.hpp>
namespace MyNamespace {
    using boost::numeric::ublas::vector;
    vector MyFunc(vector in);
}
Run Code Online (Sandbox Code Playgroud)

即,正确地包含在MyNamespace块中的"使用boost :: numeric :: ublas :: vector",还是会污染包含此标头的任何文件的命名空间?

c++ scope namespaces using

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

C++ singleton vs完全静态对象

假设我们需要在项目中只有一个类的一个实例.有几种方法可以做到这一点.

我想比较一下.请你复习一下我的理解.

1)古典单身模式

2)完全静态类(所有方法和成员都是静态的).


据我所知,差异如下:

a)未定义跨不同单元的静态成员的初始化顺序.因此,完全静态成员初始化不能使用来自其他模块的任何静态成员/函数.而单身人士没有这个问题.

b)我们必须处理Singleton的getInstance()的线程.但是,完全静态类没有这个问题.

c)访问方法看起来有点不同.FOO ::巴(); vs Foo :: getInstance() - > bar(); 通常,singleton可以返回NULL来识别构造对象时存在一些问题而静态类不能.

d)对于静态类的一堆静态,类的定义看起来有点笨拙.

我错过了什么吗?

c++ singleton static class

34
推荐指数
3
解决办法
3万
查看次数

ScopeGuard的使用是否真的能带来更好的代码?

多年前我偶然发现了Andrei Alexandrescu和Petru Marginean撰写的这篇文章,该文章介绍并讨论了一个名为ScopeGuard的实用程序类,用于编写异常安全的代码.我想知道使用这些对象进行编码是否真的能够产生更好的代码,或者是否会混淆错误处理,或许可以在catch块中更好地呈现guard的回调?有没有人在实际生产代码中使用这些经验?

c++ raii scopeguard

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

如何防止在堆上创建对象?

有没有人知道我怎么能在平台无关的C++代码中阻止在堆上创建对象?也就是说,对于"Foo"类,我想阻止用户这样做:

Foo *ptr = new Foo;
Run Code Online (Sandbox Code Playgroud)

并且只允许他们这样做:

Foo myfooObject;
Run Code Online (Sandbox Code Playgroud)

有没有人有任何想法?

干杯,

c++ heap stack

26
推荐指数
3
解决办法
8478
查看次数

如何记录函数可能抛出的所有异常?

如果你有一个公共函数可能抛出一个异常,它使用其他(私有或公共)辅助函数也可以抛出异常,我认为你应该记录公共函数可以抛出的异常,这包括辅助函数抛出的异常.

像这样(使用Doxygen):

/** 
 * @throw Exception ...
 * @throw ExceptionThrownByHelper ...
 * @throw ExceptionThrownByHelpersHelper ...
 */
void theFunction() 
{ 
    helperWhichMayThrowException();
}
Run Code Online (Sandbox Code Playgroud)

并且helperWhichMayThrowException()还调用可能抛出异常的其他函数.

为此,您可以:

  1. 递归地跟随所有函数theFunction()调用并查找该函数所引发的异常.这是很多工作,当您向助手添加异常时,您可能忘记在某处记录异常.
  2. 捕获助手抛出的所有异常theFunction()并转换它们,这样您就可以确定只抛出您指定的异常.但那么为什么要使用例外?
  3. 不要担心辅助函数抛出的异常,但是你不能对所有异常进行单元测试,因为你不知道公共函数可以抛出哪些异常
  4. 有一些工具(半)自动列出助手抛出的所有异常等.我查看了Doxygen的文档,但没有找到办法做到这一点.

我想使用选项4,但我还没有找到一个好的解决方案,也许它可以用Doxygen吗?或许我只是想要记录多少???

编辑:也许它不是很清楚,但我正在寻找一种简单的方法来记录所有异常(最好使用Doxygen)函数可能抛出而无需手动检查所有辅助函数.一种简单的方法包括"不记录所有异常"或"捕获并转换所有异常theFunction()"

c++ documentation doxygen exception

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

非const对象的Const向量

在接口中定义函数时:

virtual void ModifyPreComputedCoeffs ( std::vector < IndexCoeffPair_t > & model_ ) = 0;
Run Code Online (Sandbox Code Playgroud)

我们想要指定不应该在push_back等意义上改变向量model_操作不应该对向量进行操作,但是可以更改model_中的IndexCoeffPair_t结构对象.我们该如何指定?

virtual void ModifyPreComputedCoeffs ( const std::vector < IndexCoeffPair_t > & model_ ) = 0;
Run Code Online (Sandbox Code Playgroud)

我觉得不行.

c++ const vector const-correctness

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

从模板切换传递类型

是否可以在C++中检查传递给模板函数的类型?例如:

template <typename T>
void Foo()
{
   if (typeof(SomeClass) == T)
      ...;
   else if (typeof(SomeClass2) == T)
      ...;
}
Run Code Online (Sandbox Code Playgroud)

c++ templates types

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

如何搜索MATLAB命令历史记录?

我想搜索我之前使用过的特定命令.是否可以在MATLAB命令历史记录上进行自由文本搜索?

search matlab history

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

const shared_ptr到shared_ptr

如何将指向const对象的shared_ptr转换为指向非const对象的shared_ptr.我正在尝试执行以下操作:

boost::shared_ptr<const A> Ckk(new A(4));

boost::shared_ptr<A> kk=const_cast< boost::shared_ptr<A> > Ckk;
Run Code Online (Sandbox Code Playgroud)

但它不起作用.

boost shared-ptr

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