C++ C++;设计:如何设置共享一组变量的两个类?
这可能是一个愚蠢的问题,但是编写共享一组变量的2个类的最佳方法是什么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
可能我需要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 holdstd::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 holdstd::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。@更清晰:的确,不会,但你提出了一个正确的观点,那就是你必须小心范围/生存期。请参阅“编辑”。它肯定会导致问题。可能不会立即崩溃,但你肯定会遇到问题。你的说明证明了向上投票是正确的。@我建议更清晰一些,你变得不那么必要了。没有人“肯定”会这样做陷入问题。在不需要时使用动态分配是一种严重的悲观情绪。我建议你少教多学。这个例子会导致崩溃。如果(当)