我的编码风格包括以下习语:
class Derived : public Base
{
public :
typedef Base super; // note that it could be hidden in
// protected/private section, instead
// Etc.
} ;
Run Code Online (Sandbox Code Playgroud)
这使我能够使用"super"作为Base的别名,例如,在构造函数中:
Derived(int i, int j)
: super(i), J(j)
{
}
Run Code Online (Sandbox Code Playgroud)
或者甚至在其重写版本中从基类调用方法时:
void Derived::foo()
{
super::foo() ;
// ... And then, do something else
}
Run Code Online (Sandbox Code Playgroud)
它甚至可以链接(我仍然可以找到它的用途):
class DerivedDerived : public Derived
{
public :
typedef Derived super; // note that it could be hidden in
// protected/private section, instead
// Etc.
} ; …
Run Code Online (Sandbox Code Playgroud) 我们有一个烦人的错误,我无法解释这段代码:
unsigned char bitmap[K_BITMAP_SIZE] = {0} ;
SetBit(bitmap, K_18); // Sets the bit #18 to 1
for(size_t i = 0; i < K_END; ++i)
{
if(TestBit(bitmap, i)) // true for 18
{
size_t i2 = getData(i); // for 18, will return 15
SetBit(bitmap, i2); // BUG: IS SUPPOSED TO set the bit #15 to 1
}
}
Run Code Online (Sandbox Code Playgroud)
__forceinline
使用getData函数时才会在Visual C++ 2008上发生(默认情况下,VC++ 2008不会内联该函数,而VC++ 2010会这样做)奖金信息:
1- BenJ评论说这个问题没有出现在Visual C++ 2012上,这意味着这可能是编译器中的一个错误
2-如果我们 …
c++ visual-studio-2010 compiler-optimization undefined-behavior visual-studio
对于相同的预处理指令,这是一个多重问题.
除了在MSDN中找到的信息:
1.a:两种符号之间有什么区别?
1.b:所有编译器都以同样的方式实现它们吗?
1.c:你什么时候使用<>,什么时候会使用""(即你用什么标准来使用一个或另一个标题包括在内)?
我已经看到至少有两种写作方式包括一个项目标题.考虑到您至少有4种类型的标题,即:
对于每种标题:
2.a:你会用<>或""吗?
2.b:您是否只使用{TheProject/TheHeader.hpp}或{TheHeader.hpp}?
3.a:你是否在一个类似树的组织中使用源和/或标题的项目(即目录中的目录,而不是"一个目录中的每个文件"),有什么优点/缺点?
我熟悉C++ RTTI,发现这个概念很有意思.
仍然存在许多滥用它的方法而不是正确使用它(RTTI-switch恐惧会浮现在脑海中).作为开发人员,我发现(并且使用过)只有两种可行的用途(更确切地说,一个半).
您能否分享一些RTTI是问题的可行解决方案,包括示例代码/伪代码?
注意:目标是拥有一个可供初级开发人员可以咨询,批评和学习的可行示例的存储库.
编辑:您将使用C++ RTTI找到下面的代码
// A has a virtual destructor (i.e. is polymorphic)
// B has a virtual destructor (i.e. is polymorphic)
// B does (or does not ... pick your poison) inherits from A
void doSomething(A * a)
{
// typeid()::name() returns the "name" of the object (not portable)
std::cout << "a is [" << typeid(*a).name() << "]"<< std::endl ;
// the dynamic_cast of a pointer to another will return NULL is
// the conversion …
Run Code Online (Sandbox Code Playgroud) 注意:原始问题大量使用宏,但已针对此问题进行了简化.
// header.hpp
template <typename T>
void foo()
{
someBoolean = true ; // at this point "someBoolean" wasn't
} // declared
Run Code Online (Sandbox Code Playgroud)
然后,它用于以下来源:
// source.cpp
#include "header.hpp"
static bool someBoolean = false ;
void bar()
{
foo<char>() ; // here, we call/instantiate the function
}
Run Code Online (Sandbox Code Playgroud)
在某些编译器(Windows,以前的Solaris)中,它可以工作.在当前支持C++ 11的Solaris编译器中,它失败了,说someBoolean未定义.
根据标准,模板化代码是否可以使用一个变量(我们希望!)稍后在源代码中声明?
模板在一个标题中定义,该标题应包含在多个源中,每个源都有自己的布尔变量,并实例化模板.
预计在每个翻译单元中,模板会影响该翻译单元的静态布尔变量.
因此,预期一种类型(例如"char")上的模板的每个实例化都会影响不同的变量.
我们不是依赖于未定义的行为吗?
在与我的团队中新来的开发人员讨论之后,我意识到在C++中仍然存在使用C构造的习惯,因为它们应该更好(即更快,更精简,更漂亮,选择你的理由).
与类似的C++构造相比,有哪些示例值得共享,显示C构造?
对于每个示例,我需要阅读C++构造与原始C构造一样好或甚至更好的原因.目的是提供一些在C++代码中被认为有些危险/不安全的C构造的替代方案(C++ 0x只有在只有明确标记为C++ 0x的情况下才能接受答案).
我将在答案(结构内联初始化)下面作为示例发布.
注1:请每个案例一个答案.如果您有多个案例,请发布多个答案
注2:这不是C问题.不要在此问题中添加"C"标签. 这不应该成为C++和C之间的斗争.只研究C++的C子集的一些结构,以及它们在其他C++"工具包"中的替代方案.
注3:这不是一个抨击C的问题.我想要理由.吹嘘,抨击和未经证实的比较将被下调.提及没有C等价物的C++特性可以被认为是不可能的主题:我希望并排放置一个针对C++特性的C特征.
我需要编写一个将由新手和经验丰富的C++开发人员使用的编码约定.动态多态的继承规则如下:
- 对于动态多态,请考虑使用单继承(树状层次结构),可能具有抽象接口的多重继承
- 对于继承层次结构(基类等),默认情况下使用公共继承
- 对于继承抽象接口,默认情况下使用公共虚拟继承
此规则之后将提供有关实施,可能的例外等的详细信息.
所以,问题是这个规则是否适合新手和经验丰富的C++开发人员?(欢迎/利弊,以及来源和链接是受欢迎的)
我看到的是:
注意:我已阅读以下在线资源:
注2:在"C++编码标准"第36项中使用Sutter&Alexandrescu后,使用"抽象接口"名称
这是一个应该工作的情况(它的Java/C#等效使用接口工作),但如果接口继承不是虚拟的,那么在C++中就不会这样:
class A
{
public :
virtual ~A() = 0 {}
} ;
class B : public A {} ; // should have been virtual to avoid the error
class C : public A {} ; // should have been virtual to avoid the error
class D : public B, public C
{
public …
Run Code Online (Sandbox Code Playgroud) 我刚刚玩了Java文件系统API,并提供了以下函数,用于复制二进制文件.最初的源代码来自Web,但我添加了try/catch/finally子句,以确保在出现错误之前,在退出函数之前缓冲流将被关闭(因此,我的操作系统资源被释放).
我减少了功能以显示模式:
public static void copyFile(FileOutputStream oDStream, FileInputStream oSStream) throw etc...
{
BufferedInputStream oSBuffer = new BufferedInputStream(oSStream, 4096);
BufferedOutputStream oDBuffer = new BufferedOutputStream(oDStream, 4096);
try
{
try
{
int c;
while((c = oSBuffer.read()) != -1) // could throw a IOException
{
oDBuffer.write(c); // could throw a IOException
}
}
finally
{
oDBuffer.close(); // could throw a IOException
}
}
finally
{
oSBuffer.close(); // could throw a IOException
}
}
Run Code Online (Sandbox Code Playgroud)
据我所知,我不能把这两个close()
放在finally子句中,因为第一个close()
可以抛出,然后,第二个不会被执行.
我知道C#有Dispose模式,可以使用using
关键字来处理这个问题.
我甚至知道更好的C++代码(使用类似Java的API): …
可能重复:
结构,接口和拳击
来自MSDN:http://msdn.microsoft.com/en-us/library/yz2be5wk.aspx
Boxing是将值类型转换为类型对象或由此值类型实现的任何接口类型的过程.
但是通用接口呢?
例如,int
派生自IComparable
和IComparable<int>
.
假设我有以下代码:
void foo(IComparable value) { /* etc. */ }
void bar(IComparable<T> value) { /* etc. */ }
void gizmo()
{
int i = 42;
bar(i); // is `i` boxed? I'd say YES
foo(i); // is `i` boxed? I fear it is (but I hope for NO)
}
Run Code Online (Sandbox Code Playgroud)
是bar
(或任何采用非通用接口的功能)意味着会有拳击吗?
是foo
(或任何函数采用类型的通用接口)意味着将有拳击?
谢谢.
背景信息:这是在Visual Studio 2008上检测到的,并在Visual Studio 2013上再次确认.G ++在代码中尖叫,而Visual以静默方式接受私有继承泄露.
因此,在Visual C++上,我们有以下代码:
class Base {};
class Derived : Base {}; // inherits privately. Adding explicitly the
// keyword private changes nothing
int main()
{
std::auto_ptr<Base>(new Derived) ; // compiles, which is NOT EXPECTED
std::auto_ptr<Base> p(new Derived) ; // Does not compile, which is expected
}
Run Code Online (Sandbox Code Playgroud)
为什么第一个(临时)auto_ptr会编译?我在调试中进入它,它确实完成了对公共继承应该做的事情(调用正确的构造函数等)
想知道问题是否与auto_ptr实现有关(我们永远不知道......),我减少了这个独立代码的问题:
class Base {};
class Derived : Base {};
template <typename T>
class Ptr
{
T * m_p;
public :
Ptr(T * p_p)
: m_p(p_p)
{
}
} …
Run Code Online (Sandbox Code Playgroud)