C++ 如何在继承级别的多个实例之间共享相同的数据?
我想实例化具有相同继承级别的多个对象,并为每个继承级别使用相同的数据。所以我考虑类的继承和静态成员 这是我的: 在我的示例中,两个Child1实例都应该使用GetValue返回10,而两个Child2实例都应该使用GetValue返回20。由于函数是相同的,我不想为每个孩子重写它,这就是为什么我把它放在父亲中 问题是Child1实例也返回20个调用GetValue的实例 因此,静态是在主父级而不是子级之间共享的 由于该sValue值用于GetValue,因此将其放置在此处是正确的。但我不能这样分离静态/相同的数据 您将如何做到这一点?当您调用child1\u 1.sValue=1时,您正在修改父::sValue;和child2_1.s值=2;有一个实例,它属于父类,因此您可以通过一个方法对类或实例进行访问,在调用GetValue之前,您将获得它设置为的任何值C++ 如何在继承级别的多个实例之间共享相同的数据?,c++,inheritance,static,C++,Inheritance,Static,我想实例化具有相同继承级别的多个对象,并为每个继承级别使用相同的数据。所以我考虑类的继承和静态成员 这是我的: 在我的示例中,两个Child1实例都应该使用GetValue返回10,而两个Child2实例都应该使用GetValue返回20。由于函数是相同的,我不想为每个孩子重写它,这就是为什么我把它放在父亲中 问题是Child1实例也返回20个调用GetValue的实例 因此,静态是在主父级而不是子级之间共享的 由于该sValue值用于GetValue,因此将其放置在此处是正确的。但我不能这样分
如果您想要一个Child1和Child2版本,那么可以向这些类添加静态成员和方法。我认为您需要的是以下内容:
class Father
{
public:
inline int GetValue() { return DoGetValue() * 10; }
void SetValue( int value ) { DoSetValue( value ); }
protected:
virtual int DoGetValue() = 0;
virtual void DoSetValue( int value ) = 0;
};
class Child1 : public Father
{
public:
static int sValue;
protected:
int DoGetValue() override { return sValue; }
void DoSetValue( int value ) override { sValue = value; }
};
class Child2 : public Father
{
public:
static int sValue;
protected:
int DoGetValue() override { return sValue; }
void DoSetValue( int value ) override { sValue = value; }
};
int Child1::sValue = 0;
int Child2::sValue = 0;
int main()
{
Child1 child1_1;
Child1 child1_2;
Child2 child2_1;
Child2 child2_2;
child1_1.SetValue( 1 );
child2_1.SetValue( 2 );
std::cout << child1_2.GetValue() << std::endl;
std::cout << child2_2.GetValue() << std::endl;
}
splrs用户已正确识别您的问题,并且解决方案是正确的。您需要两个具有两个不同静态对象的不同函数。通过使用模板,可以避免重复代码:
template<class Child>
struct Father {
static int sValue;
int GetValue() { /* ... */ }
};
struct Child1 : Father<Child1> {};
struct Child2 : Father<Child2> {};
在每个派生类中放置静态成员?@LogicStuff:否,否则我不能在GetValue中使用sValue,这是一个常见的函数…然后创建一个虚拟函数GetSValue,将在GetValue中使用。只需为子类创建一个构造函数,并在创建对象实例时初始化子对象的sValue。确保svalue不是静态的。@paizza,这样它就不会工作了。请阅读我的帖子。如果我这样做,GetValue就不能运行,这是一个必须使用的公共函数。这是非常冗余的。如果我有20个变量而不是1个值,我需要为每个继承重新声明它20次。每个getter/setter都相同。我想我会尝试一些手术。@paizza也许你想做一些不可能的事情。或者至少我不知道,这是我的本意。它有时会说:另外,使信封生成器的stageValue保持静态意味着卷和过滤器信封总是相同的。这可以通过继承来解决:我们可以创建一个VolumeDevelop和FilterDevelop类,并从EnvelopeGenerator继承这两个类。stageValue可以是静态的,VolumeDevelope和FilterDevelope都可以覆盖它。覆盖静态成员意味着什么?不确定你在用struct做什么。我需要上课。所有子类的唯一函数,每个派生级别类的共享静态函数。你能举个例子吗?@paizza a struct是一个类。我使用它来保持示例简洁。但是如果您愿意,可以使用class关键字。每个子类都有自己的静态成员,从模板化父类继承,是的。这些例子在我的回答中。
template<class Child>
struct Father {
static int sValue;
int GetValue() { /* ... */ }
};
struct Child1 : Father<Child1> {};
struct Child2 : Father<Child2> {};
struct FatherBase {};
template<class Child>
struct Father : FatherBase { /*...*/ };
struct FatherBase {
virtual int GetValue() = 0;
};
template<class Child>
struct Father : FatherBase {
// ...
int GetValue() override { /* ... */ }
};