C++ 当不需要创建多个对象时,类的成员是否应变为静态?

C++ 当不需要创建多个对象时,类的成员是否应变为静态?,c++,oop,class,static,C++,Oop,Class,Static,我的类不会有不同的对象在它们之间或与其他对象交互。 当然,我需要至少有一个对象来调用这个类的函数,因此我考虑将成员设置为static,这样就可以避免不必要的对象创建 这种设计的优点和缺点是什么?什么是更好的设计 当不需要创建多个对象时,是否应将类的成员变为静态 当类的所有对象只需要一个成员实例时,就可以创建类的成员static。当您声明一个类成员static时,该成员将变为每个类,而不是每个对象 当您说您只需要类中的一个对象时,您可能指向的是单例设计模式。注意,模式被广泛认为是一种反模式,它的有

我的类不会有不同的对象在它们之间或与其他对象交互。
当然,我需要至少有一个对象来调用这个类的函数,因此我考虑将成员
设置为static
,这样就可以避免不必要的对象创建

这种设计的优点和缺点是什么?什么是更好的设计

当不需要创建多个对象时,是否应将类的成员变为
静态

当类的所有对象只需要一个成员实例时,就可以创建类的成员
static
。当您声明一个类成员
static
时,该成员将变为每个类,而不是每个对象

当您说您只需要类中的一个对象时,您可能指向的是单例设计模式。注意,模式被广泛认为是一种反模式,它的有用性取决于具体情况

您在Q中提到的原因与您是否应该使成员成为静态成员无关

当不需要创建多个对象时,是否应将类的成员变为
静态

当类的所有对象只需要一个成员实例时,就可以创建类的成员
static
。当您声明一个类成员
static
时,该成员将变为每个类,而不是每个对象

当您说您只需要类中的一个对象时,您可能指向的是单例设计模式。注意,模式被广泛认为是一种反模式,它的有用性取决于具体情况


您在Q中提到的原因与是否应该使成员成为静态成员无关。

要访问静态成员,您甚至不需要对象,只需调用

class AA
{
    public:
        AA ();
        static void a1          ();
        static std :: string b1 ();
        static std :: string c1 (unsigned short x);
};

这种模式被称为“Monostate”,另一种模式是Singleton,在这里您实际上创建了一个对象,但要确保只创建一次,有大量关于如何创建的教程,只需通过谷歌搜索即可。

要访问静态成员,您甚至不需要对象,只需调用

class AA
{
    public:
        AA ();
        static void a1          ();
        static std :: string b1 ();
        static std :: string c1 (unsigned short x);
};

这种模式被称为“Monostate”,另一种模式是Singleton,在这里您实际上创建了一个对象,但请确保只创建了一次,有大量关于如何创建对象的教程,只需通过谷歌搜索即可。

您的类没有数据成员,因此我看不到任何使用类的好理由:

AA::a1()
当然,我需要至少有一个对象来调用这个类的函数

那不是真的。您可以在没有类实例的情况下调用静态成员函数

关于Singleton模式的一个注意事项:它名声不好,经常被误用,根据我的经验,它很少有用。它所做的是强制该类只能有一个实例,并且该实例是全局可访问的

人们通常认为,“我只需要一个实例,因此我应该使用Singleton”,特别是当Singleton是他们第一个引入的大写设计模式时。这是错误的——如果您只需要一个实例,请创建一个实例并使用它。不要不必要地限制类的所有未来用户只创建一个实例。不要不必要地创建共享全局状态。这两种情况都会降低代码的灵活性,更难以不同的方式使用,因此更难测试。有些人会争辩说,出于这些原因,单身绝对没有用处


在这种情况下,您甚至不需要一个实例。如果是这样的话,我会像上面那样使用自由函数。

您的类没有数据成员,因此我认为没有任何理由使用类:

AA::a1()
当然,我需要至少有一个对象来调用这个类的函数

那不是真的。您可以在没有类实例的情况下调用静态成员函数

关于Singleton模式的一个注意事项:它名声不好,经常被误用,根据我的经验,它很少有用。它所做的是强制该类只能有一个实例,并且该实例是全局可访问的

人们通常认为,“我只需要一个实例,因此我应该使用Singleton”,特别是当Singleton是他们第一个引入的大写设计模式时。这是错误的——如果您只需要一个实例,请创建一个实例并使用它。不要不必要地限制类的所有未来用户只创建一个实例。不要不必要地创建共享全局状态。这两种情况都会降低代码的灵活性,更难以不同的方式使用,因此更难测试。有些人会争辩说,出于这些原因,单身绝对没有用处


在这种情况下,您甚至不需要一个实例。如果是这样的话,我会像上面那样使用自由函数。

@AnishaKaul
static
不是单例设计模式,但它也可以工作。“当你说你只需要类中的一个对象时,你可能指向单例设计模式。”这是我错过的一个要点。singleton之所以是反模式,正是因为它与只需要一个类实例不同。如果只需要一个实例,则只创建一个实例。Singleton所做的是强制您只能创建一个实例,不管您可能需要多少实例,或者您的类的其他客户端可能需要多少实例,或者您将来或在测试条件下可能需要多少实例。。。。基本上,这就是只需要一个和只需要一个之间的区别。不要仅仅因为前者是正确的就实现后者。@AnishaKaul
static
不是单例设计模式,但它也可以工作。“当你说你只需要类中的一个对象时,你可能是在指向单例