【问题标题】:What does "class :" mean in C++?“类:”在 C++ 中是什么意思?
【发布时间】:2011-06-10 09:56:50
【问题描述】:

我以前从未见过。我认为这是“::sample”的拼写错误,但是当我看到它实际编译时我很困惑。任何人都可以帮我找出来吗?我不认为这是goto 标签。

void f() {
  class: sample {
    // there were some members declared here
  } x;
}

【问题讨论】:

  • 看起来像一个匿名类(继承自示例)实例 x。以前从未见过这个。也许是 C++0x?
  • 只是猜测:这可能是从sample派生的未命名类吗?
  • 这不是goto 标签?正确,gotoclass 的顶部!
  • 我什至没有注意到这是你。噗。
  • @Johannes 如果您还没有,请查看此code review proposal。该网站绝对可以从您的 C++ 能力中受益。

标签: c++ class colon


【解决方案1】:

它是一个未命名的类,冒号表示它私有地继承自sample。看看就好

class Foo : private sample
{
    // ...
};

Foo x;

【讨论】:

  • 哇,这很有趣。看来你是对的,范围内有一个类“样本”,类成员访问基类。现在我明白了。
  • @Johannes:这是一种非常有限的方法,因为未命名的类不能有非默认构造函数或析构函数,也不能用作模板(因为它是本地类)。我很好奇这个结构的用途是什么。我知道本地类的唯一用例是“类型擦除习语”(即返回sample*,但sample 是此处不可访问的基类)。
  • @Alexandre 它没有发生在真实的代码中。这是我的游乐场文件之一。
  • 它不是一个未命名的类实例;这是一个未命名的类。
【解决方案2】:

我认为这是定义派生自sample一个未命名的类。而x 是那个未命名类的变量。

struct sample{ int i;};

sample f() 
{
  struct : sample 
  {
    // there were some members declared here
  } x;
  x.i = 10;
  return x;
}
int main() 
{
        sample s = f();
        cout << s.i << endl;
        return 0;
}

ideone 的示例代码:http://www.ideone.com/6Mj8x

PS:出于可访问性原因,我将class 更改为struct

【讨论】:

    【解决方案3】:

    这是一个未命名的类。

    您可以使用它们,例如替换 pre-C++11 中的局部函数:

    int main() {
        struct {
            int operator() (int i) const {                 
                return 42;
            }
        } nice;
    
        nice(0xbeef);
    }
    

    冒号后跟sample 仅表示使用默认继承从sample 派生。 (对于结构:公共,对于类:私有)

    【讨论】:

      猜你喜欢
      • 2013-03-09
      • 1970-01-01
      • 1970-01-01
      • 2011-07-07
      • 2016-12-08
      • 2016-04-19
      • 2015-04-11
      • 2012-04-25
      • 2011-08-25
      相关资源
      最近更新 更多