【问题标题】:Class with no name, constructor, destructor没有名称、构造函数、析构函数的类
【发布时间】:2013-12-06 18:58:38
【问题描述】:

我读过关于没有名字的类...

知道了

class
{ 
  int i;
};

虽然无效

class
{ 
  int i;
}A;

有效。 但是如何有一个:1)构造函数和:2)析构函数和:3)如何作为参数传递???

【问题讨论】:

  • 你不能有构造函数或析构函数。您可以使用decltype(A) 获取类型以用作参数,但您也可以为类命名。
  • 如果匿名类满足要求,仍然可以使用大括号初始化。

标签: c++


【解决方案1】:

如果类未命名,则它不能有自定义构造函数/析构函数(尽管编译器会为您生成通常的默认值)。这意味着您不能在构造时将参数传递给它。但是,可能没有什么可以阻止您 (1) 在类中添加一个或方法以在构造后将数据传递给它,或者 (2) 首先为类命名。

【讨论】:

    【解决方案2】:

    第二件事是有效的,但您不能访问成员 i,因为它是私有的。仅因为您创建了该类类型的对象 A 才有效。

    要拥有一个构造函数,我认为你必须给类一个名字。使用这个:

    class myclass
    { 
      int i;
      public:
         myclass(int a) //This is the constructor
         {
               i = a;
         }
         ~myclass()  //This is the destructor
         {
               //Whatever you want to do on destroying the object
         }
    
    };
    

    并按如下方式实例化该类:

    myclass A(10);
    

    或类似的。

    注意:这只是我的解释,可以通过许多其他方式完成。

    【讨论】:

    • 3.cpp:8:3: 错误:C++ 需要所有声明的类型说明符 noname(int a) ^~~~~~~ 3.cpp:12:4: 错误:期望类在 '~' 之后命名一个析构函数 ~noname() ^ 3.cpp:19:2: error: unknown type name 'noname' noname classA(10); ^ 生成 3 个错误。
    • 在声明类时,不要在那里用 A 实例化。按照我告诉你的方式分别实例化。
    • 单独定义变量A没有区别。并且调用 noname 是令人困惑的,因为 noname 是一个名字。
    • 这只是我为了给班级取名而用双关语的拙劣尝试:)。我会通过我的编辑让大家更清楚地看到它。
    【解决方案3】:

    你注定只能在本地使用类并通过本地对象 A 访问它。

    不过,您可以在模板中使用它:

    template <typename T>
    inline void print(const T& a) {
        std::cout << a.x << std::endl;
    }
    
    int main()
    {
        class {
            public: int x;
        } a;
        a.x = 1;
        print(a);
    }
    

    【讨论】:

      猜你喜欢
      • 2018-04-30
      • 2014-05-27
      • 1970-01-01
      • 2015-06-30
      • 2016-02-20
      • 2012-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多