C++ C++;设计:如何设置共享一组变量的两个类?

C++ C++;设计:如何设置共享一组变量的两个类?,c++,class-design,class-hierarchy,shared-data,C++,Class Design,Class Hierarchy,Shared Data,这可能是一个愚蠢的问题,但是编写共享一组变量的2个类的最佳方法是什么 A类和B类都需要访问int x和int y 如果A类改变x或y,这些改变应反映在B类中 我的想法: 类A和B可以继承类C(包含变量x,y) -但这将为A和B创建一个c实例。 -我只需要一个x和y的实例 可能我需要friend类或静态变量?使用带有静态变量的基类: #include <iostream> struct C { static int x; static int y; }; struct

这可能是一个愚蠢的问题,但是编写共享一组变量的2个类的最佳方法是什么

  • A类和B类都需要访问int x和int y
  • 如果A类改变x或y,这些改变应反映在B类中
  • 我的想法: 类A和B可以继承类C(包含变量x,y) -但这将为A和B创建一个c实例。 -我只需要一个x和y的实例


    可能我需要friend类或静态变量?

    使用带有静态变量的基类:

    #include <iostream>
    struct C
    {
        static int x;
        static int y;
    };
    
    struct A : C
    {
    
    };
    
    struct B : C
    {
    
    };
    
    int C::x = 0;
    int C::y = 0;
    
    int main()
    {
        A a;
        a.x = 1;
        a.y = 2;
        B b;
        std::cout << b.x << b.y << '\n';
    }
    
    #包括
    结构C
    {
    静态int x;
    静态智力;
    };
    结构A:C
    {
    };
    结构B:C
    {
    };
    int C::x=0;
    int C::y=0;
    int main()
    {
    A A;
    a、 x=1;
    a、 y=2;
    B B;
    
    std::cout使用带有静态变量的基类:

    #include <iostream>
    struct C
    {
        static int x;
        static int y;
    };
    
    struct A : C
    {
    
    };
    
    struct B : C
    {
    
    };
    
    int C::x = 0;
    int C::y = 0;
    
    int main()
    {
        A a;
        a.x = 1;
        a.y = 2;
        B b;
        std::cout << b.x << b.y << '\n';
    }
    
    #包括
    结构C
    {
    静态int x;
    静态智力;
    };
    结构A:C
    {
    };
    结构B:C
    {
    };
    int C::x=0;
    int C::y=0;
    int main()
    {
    A A;
    a、 x=1;
    a、 y=2;
    B B;
    
    std::cout首先-这要看情况。你还没有告诉我们整个故事。但是你已经做了一些假设,我想阻止你做这些假设

    A和B共享一些共同数据的事实并不意味着它们本质上是相同的。一个人可能有一个旅行目的地,一个会议可能有一个地点,但这并不意味着它们必须是同一事物的子类

    因此,很可能您应该使用以下内容:

    struct C { int x; int y; };
    
    class A { 
        C& foo;
        int bar;
        A(C& some_c) : foo(some_c) { }
        // ... etc. ...
    };
    
    class B { 
        C& baz;
        int qux;
        A(C& some_c) : baz(some_c) { }
        // ... etc. ...
    };
    
    没有继承,没有友元类,没有静态变量——没有这些东西。继承可能是合适的;同样,这取决于


    注意:我给出的示例没有解决A、B和C变量在作用域/生存期方面的潜在差异。如果存在这种差异,那么在堆上创建所有这些对象并将A和B hold
    std::shared_ptr

    保存到C可能是有意义的。首先,这取决于。你还没有告诉我们全部情况。但是你已经做了一些假设,我不想让你这么做

    A和B共享一些共同数据的事实并不意味着它们本质上是相同的。一个人可能有一个旅行目的地,一个会议可能有一个地点,但这并不意味着它们必须是同一事物的子类

    因此,很可能您应该使用以下内容:

    struct C { int x; int y; };
    
    class A { 
        C& foo;
        int bar;
        A(C& some_c) : foo(some_c) { }
        // ... etc. ...
    };
    
    class B { 
        C& baz;
        int qux;
        A(C& some_c) : baz(some_c) { }
        // ... etc. ...
    };
    
    没有继承,没有友元类,没有静态变量——没有这些东西。继承可能是合适的;同样,这取决于



    注意:我给出的示例没有解决A、B和C变量的作用域/生命周期中可能存在的差异。如果存在这种差异,那么在堆上创建所有这些对象并将A和B hold
    std::shared\u ptr
    保存到C可能是有意义的。

    看起来像是XY问题,不清楚为什么需要它们进行共享。是否需要所有
    A
    和所有
    B都需要相同的
    x`和
    y
    ,或者每组
    A
    B
    都应该有自己的
    x
    y
    全局变量。或者可以使用静态类成员,如下面的答案所示……注意,在运行时不存在变量(它们只存在于C++源代码中)。只有编译器关心变量(在程序执行期间,您已经忘记了位置和变量)。因此,严格意义上说,你的问题没有任何意义。看起来像XY问题,你不清楚为什么需要它们共享。所有
    A
    B都需要相同的
    x`和
    y
    ,或者每组
    A
    B
    都应该有自己的
    x
    y
    ?制作
    x
    y
    全局变量。或者使用静态类成员,如下面的答案…注意在运行时不存在变量(它们只存在于C++源代码中)。只有编译器关心变量(在程序执行期间,您已经忘记了位置和变量)。.所以严格意义上你的问题毫无意义。无视@SergeyA的“建议”。你能不能对你的论点少一点建设性?@SergeyA为什么是全局变量?静态类成员有什么问题?全局变量污染了你的整个命名空间,而静态成员变量至少只污染了你类的命名空间。至少你可以使用命名空间,类不是用于此用途的。忽略@SergeyA的“忠告"。你能不能对你的论点少一点建设性?@SergeyA为什么是全局变量?静态类成员有什么问题?全局变量污染了你的整个命名空间,而静态成员变量至少只污染了你类的命名空间。至少你可以使用命名空间,而类不是用于此用途。此示例将导致c皮疹。如果(当)有人在
    A
    B
    的一个实例使用它之前处理了
    C
    的一个实例,它会做一些说不出的事情。人们仍然(出于某种原因)执行手动内存管理。使用
    std::shared_ptr
    而不是
    C&
    将获得相同的结果,但更安全。@更清楚,不是这样。不需要时不需要使用
    shared_ptr
    。在这种情况下,根据使用情况,它可能需要或不需要,并且您提出的广泛建议不需要rranted。@更清晰:的确,不会,但你提出了一个正确的观点,那就是你必须小心范围/生存期。请参阅“编辑”。它肯定会导致问题。可能不会立即崩溃,但你肯定会遇到问题。你的说明证明了向上投票是正确的。@我建议更清晰一些,你变得不那么必要了。没有人“肯定”会这样做陷入问题。在不需要时使用动态分配是一种严重的悲观情绪。我建议你少教多学。这个例子会导致崩溃。如果(当)