我知道按定义,内联成员函数应该进入标题.但是如果不能将函数的实现放入标题呢?让我们来看看这种情况:
档案啊
#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++头文件中是否安全(和正确)以在命名空间中使用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",还是会污染包含此标头的任何文件的命名空间?
假设我们需要在项目中只有一个类的一个实例.有几种方法可以做到这一点.
我想比较一下.请你复习一下我的理解.
1)古典单身模式
2)完全静态类(所有方法和成员都是静态的).
据我所知,差异如下:
a)未定义跨不同单元的静态成员的初始化顺序.因此,完全静态成员初始化不能使用来自其他模块的任何静态成员/函数.而单身人士没有这个问题.
b)我们必须处理Singleton的getInstance()的线程.但是,完全静态类没有这个问题.
c)访问方法看起来有点不同.FOO ::巴(); vs Foo :: getInstance() - > bar(); 通常,singleton可以返回NULL来识别构造对象时存在一些问题而静态类不能.
d)对于静态类的一堆静态,类的定义看起来有点笨拙.
我错过了什么吗?
有没有人知道我怎么能在平台无关的C++代码中阻止在堆上创建对象?也就是说,对于"Foo"类,我想阻止用户这样做:
Foo *ptr = new Foo;
Run Code Online (Sandbox Code Playgroud)
并且只允许他们这样做:
Foo myfooObject;
Run Code Online (Sandbox Code Playgroud)
有没有人有任何想法?
干杯,
如果你有一个公共函数可能抛出一个异常,它使用其他(私有或公共)辅助函数也可以抛出异常,我认为你应该记录公共函数可以抛出的异常,这包括辅助函数抛出的异常.
像这样(使用Doxygen):
/**
* @throw Exception ...
* @throw ExceptionThrownByHelper ...
* @throw ExceptionThrownByHelpersHelper ...
*/
void theFunction()
{
helperWhichMayThrowException();
}
Run Code Online (Sandbox Code Playgroud)
并且helperWhichMayThrowException()还调用可能抛出异常的其他函数.
为此,您可以:
theFunction()调用并查找该函数所引发的异常.这是很多工作,当您向助手添加异常时,您可能忘记在某处记录异常.theFunction()并转换它们,这样您就可以确定只抛出您指定的异常.但那么为什么要使用例外?我想使用选项4,但我还没有找到一个好的解决方案,也许它可以用Doxygen吗?或许我只是想要记录多少???
编辑:也许它不是很清楚,但我正在寻找一种简单的方法来记录所有异常(最好使用Doxygen)函数可能抛出而无需手动检查所有辅助函数.一种简单的方法包括"不记录所有异常"或"捕获并转换所有异常theFunction()"
在接口中定义函数时:
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++中检查传递给模板函数的类型?例如:
template <typename T>
void Foo()
{
if (typeof(SomeClass) == T)
...;
else if (typeof(SomeClass2) == T)
...;
}
Run Code Online (Sandbox Code Playgroud) 我想搜索我之前使用过的特定命令.是否可以在MATLAB命令历史记录上进行自由文本搜索?
如何将指向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)
但它不起作用.