代码之家  ›  专栏  ›  技术社区  ›  Gameatro

为什么对象之前没有在类定义的末尾声明;就像在c/c++中为结构声明一样?[关闭]

  •  0
  • Gameatro  · 技术社区  · 6 年前

    创建结构时,通常在定义末尾声明变量,如下所示:

    struct <name> 
    {
      .......
    } <variable1>,<variable2>;
    

    同样的方法也适用于以下类:

    class <name>
    {
       ......
    } <object1>,<object2>;
    

    那么,为什么这样做不是一种普遍的做法呢?我从未在任何地方见过这种用法。这会引起一些问题吗?这是不好的做法吗?如果是,为什么会发生什么问题?

    3 回复  |  直到 6 年前
        1
  •  4
  •   Alceste_    6 年前

    我第一次写这篇文章是作为一个评论,但它占用了相当多的角色,并变成了一个有点aswer。

    @尼尔巴特沃斯,那有什么问题?通常我的意思是 在大多数地方,它被显示为定义结构变量的方式,但是 这样的例子不是为课堂而设的。

    这并不是说它有什么问题,它只是没有任何实际用途,除了允许您编写在单个函数中保存的简单示例代码(您的引用似乎是这样做的)。

    除了各种其他东西外,还使用对象来编写清晰、可重用的代码。如果在使用对象类型的代码中定义该对象类型,则意味着您不打算使用该类型,因为其他文件或模块(或仅命名空间/作用域)将无法访问该定义。

    唯一的方法是在声明/定义类时声明类类型的一些全局变量。。你可能已经知道了,像这样的全局变量可能是一个反模式。


    结构有点不同,因为它们通常被视为“普通的旧数据对象”,尽管它们与c++中的类几乎相同。这意味着它们不太用于代码重用,也不总是需要公开。

    例如,有人可以在一个函数中创建一个匿名结构,用一种比拥有十几个分离变量更干净的方式保存彼此相关的数据。然后就可以使用你的语法了。但在类中这样做意味着必须添加 public: 无缘无故地变重。

    总而言之:

    不是说做不到,但这几乎违背了 class 代表,所以我们不这么做。

    即使有了结构,也不会经常出现在结构定义之外的情况,但是在给出代码示例时,它允许一个人展示他所需要的一切,而不必在他的书中花费整个应用程序文件结构的开销,这很好,可能也是你看到这一点的原因。

        2
  •  2
  •   Mohammed Zaed    6 年前

    让我们把答案分成两部分:

    语法:

    1. 从语法上讲,我认为它是部分正确的,因为您可以完美地创建 混凝土等级 只是但不是 接口/抽象类 这在C++中更为常见。使用您提到的用于定义结构类型的样式。下面是使用相同样式创建其对象的类的代码。

      #include <iostream>
      
      class A
      {
      public:
         A(){std::cout << "Constructor" << std::endl;}
         void run();
         //virtual void init() = 0; //Will not compile, if init() is uncommented
      }obj1, obj2;
      
      void A::run()
      {
         std::cout << "Run" << std::endl;
      }
      int main()
      {
         obj1.run();
         return 0;
      }
      

    上面的样式有问题:

    1. 这个 寿命 范围 变量的值将附加类声明。
    2. 如果类已在头文件中声明,并且其对象是用相同的样式实例化/创建的。然后,它不必要地创建类的对象,即使您不需要。
    3. 大多数时候你只需要用类来创建 指针 参考文献 为了它。
    4. 如果我想增加或减少该文件的实例/对象的数量,那么我需要在该文件中进行更改,其中类已声明。如果你要发布你的库或代码,这可能是危险的,而且不是一个好的实践。
    5. 这种风格与 开闭原理 - 应该能够扩展任何类的行为,而无需修改类。。 Oops原理之一
    6. 也几乎矛盾, SRP-单一责任原则 - 一个班级应该有一个,而且只有一个,改变的理由。 另一个面向对象的原则。 现在,您的类承担着创建自己的对象的任务。
    7. C++中的大多数类都是从接口/抽象类继承的。它不能被实例化,只能用于运行时多态性。

    这些是一些问题,我可以看到目前,与您提到的风格。

    底线: 依我看,这是一种不好的风格。因为它将禁止您实现多态性。

    您可能已经看到了这种语法,主要是“C”代码,用于嵌入式程序和低级驱动器代码(用于8051、msp430等)。他们主要使用它,因为他们完全知道该变量使用的实例数量,而代码主要是while循环。

        3
  •  -1
  •   user1588931    6 年前

    没有什么能阻止你这么做。从技术上讲,结构和类几乎是一样的,除了它们的成员的默认可见性(对于结构是公共的,对于类是私有的)之外。

    然而,虽然struct最常用于普通的旧数据结构,但类最常用于封装状态和行为,通常是以多态的方式。这仅仅是人们自然做出的选择,因为C语言存在于C语言中,用作POD,而类在C++中引入,同时继承和成员函数。这种区别可能是结构经常立即声明和实例化的原因之一,而类的声明是单独导出的。