小编pae*_*bal的帖子

在C++中使用"super"

我的编码风格包括以下习语:

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)

c++ coding-style

192
推荐指数
8
解决办法
15万
查看次数

这是编译器优化错误还是未定义的行为?

我们有一个烦人的错误,我无法解释这段代码:

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)
  1. 它发生在Visual C++ 2010上
  2. 它发生在32位和64位版本上
  3. 它仅在发布版本上发生(设置为"最大化速度(/ O2)")
  4. 它不会仅在"最小化大小(/ O1)"设置的发布版本中发生
  5. 只有当我们__forceinline使用getData函数时才会在Visual C++ 2008上发生(默认情况下,VC++ 2008不会内联该函数,而VC++ 2010会这样做)
  6. 它发生在下面给出的代码片段上,可能是因为循环内部有大量内联
  7. 如果我们删除循环并直接设置有趣的值就不会发生(18)

奖金信息:

1- BenJ评论说这个问题没有出现在Visual C++ 2012上,这意味着这可能是编译器中的一个错误

2-如果我们 …

c++ visual-studio-2010 compiler-optimization undefined-behavior visual-studio

48
推荐指数
2
解决办法
2939
查看次数

C++ #include语义

对于相同的预处理指令,这是一个多重问题.

1 - <>或""?

除了在MSDN中找到的信息:

#include指令(C-C++)

1.a:两种符号之间有什么区别?
1.b:所有编译器都以同样的方式实现它们吗?
1.c:你什么时候使用<>,什么时候会使用""(即你用什么标准来使用一个或另一个标题包括在内)?

2 - #include {TheProject/TheHeader.hpp}或{TheHeader.hpp}?

我已经看到至少有两种写作方式包括一个项目标题.考虑到您至少有4种类型的标题,即:

  • 您项目的私有标题?
  • 您的项目的标题,但导出符号(因此,"公共")
  • 模块链接的另一个项目的标题
  • 编译器或标准库的标头

对于每种标题:

2.a:你会用<>或""吗?
2.b:您是否只使用{TheProject/TheHeader.hpp}或{TheHeader.hpp}?

3 - 奖金

3.a:你是否在一个类似树的组织中使用源和/或标题的项目(即目录中的目录,而不是"一个目录中的每个文件"),有什么优点/缺点?

c++ c-preprocessor

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

C++ RTTI可行示例

我熟悉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)

c++ rtti

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

在模板函数中使用未声明的变量合法吗?

注意:原始问题大量使用宏,但已针对此问题进行了简化.

这个问题

// 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++ templates

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

C++构造替换C构造

在与我的团队中新来的开发人员讨论之后,我意识到在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++ language-construct

17
推荐指数
9
解决办法
3177
查看次数

虚拟继承使用

我需要编写一个将由新手和经验丰富的C++开发人员使用的编码约定.动态多态的继承规则如下:

  • 对于动态多态,请考虑使用单继承(树状层次结构),可能具有抽象接口的多重继承
  • 对于继承层次结构(基类等),默认情况下使用公共继承
  • 对于继承抽象接口,默认情况下使用公共虚拟继承

此规则之后将提供有关实施,可能的例外等的详细信息.

所以,问题是这个规则是否适合新手和经验丰富的C++开发人员?(欢迎/利弊,以及来源和链接是受欢迎的)


我看到的是:

优点:

  • 规则易于新手使用,不限制经验丰富的开发人员.
  • 对那些已经熟悉Java/.NET接口的人来说很熟悉
  • 避免与实现的虚拟继承相关的问题(因为它是为抽象接口保留的),以及非虚拟继承(在转换为接口类时可能存在歧义)

缺点:

  • 轻微的性能成本(转换到接口时的速度,虚拟表的大小,类实例中的附加指针)

注意:我已阅读以下在线资源:

注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)

c++ oop inheritance multiple-inheritance

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

Java中的RAII ......资源处理总是那么难看?

我刚刚玩了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): …

java design-patterns raii resource-management

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

将结构体转换为通用接口时是否存在Boxing/Unboxing?

可能重复:
结构,接口和拳击

来自MSDN:http://msdn.microsoft.com/en-us/library/yz2be5wk.aspx

Boxing是将值类型转换为类型对象由此值类型实现的任何接口类型的过程.

但是通用接口呢?

例如,int派生自IComparableIComparable<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(或任何函数采用类型的通用接口)意味着将有拳击?

谢谢.

c# generics boxing

15
推荐指数
3
解决办法
5600
查看次数

为什么auto_ptr似乎违反了Visual C++上的私有继承?

背景信息:这是在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)

c++ visual-studio private-inheritance

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