gpt4 book ai didi

C++每个派生类中的不同常量成员,如何移动函数以消除访问中的重复?

转载 作者:太空狗 更新时间:2023-10-29 21:07:25 25 4
gpt4 key购买 nike

我的派生类在某些常量属性上有所不同。在所有派生类中,我都有一个返回属性的函数。有没有办法将 get_x 函数移动到基类中以删除重复项?我查看了这个线程和很多谷歌搜索,但我找不到我想要的东西: C++ : Initializing base class constant static variable with different value in derived class?

class Derived1: public Base{
static const attribute x = SOME_ATTRIBUTE1;
attribute get_x(){
return x;
}
};

class Derived2: public Base{
static const attribute x = SOME_ATTRIBUTE2;
attribute get_x(){
return x;
}
};

我希望它看起来像这样,但这不起作用,因为 x 没有在 base 中定义。我也尝试过 extern、static const attribute x 等。

class Derived1: public Base{
static const attribute x = SOME_ATTRIBUTE1;
};

class Derived2: public Base{
static const attribute x = SOME_ATTRIBUTE2;
};

class Base{
attribute get_x(){
return x;
}
};

谢谢。

最佳答案

有点笨拙,但您可以使用类似于以下内容的方法来执行此操作:

template <attribute x> class Base
{
public:
attribute get_x ( ) { return x; }
};

class Derived1 : public Base<SOME_ATTRIBUTE_1>
{
...
};

class Derived2 : public Base<SOME_ATTRIBUTE_2>
{
...
};

类似于 Karl 的回答,但保留了继承/派生关系(好吧,差不多 - 请参阅下面@visitor 的评论)。

另一方面,是否有理由不进行简单的覆盖?例如:

class Base
{
public:
virtual attribute get_x ( ) = 0;
};

class Derived1 : public Base
{
public:
attribute get_x ( ) { return SOME_ATTRIBUTE_1; };
};

class Derived2 : public Base
{
public:
attribute get_x ( ) { return SOME_ATTRIBUTE_2; };
};

编辑:请注意,模板方法可以根据需要扩展到尽可能多的属性,如下所示:

template <attribute1 x, attribute2 y ...> class Base
{
public:
attribute get_x ( ) { return x; }
attribute get_y ( ) { return y; }
...
};

将每个属性都作为类的属性的另一种解决方案如下:

class Base
{
public:
Base (attribute newX) : x(newX) { }
attribute get_x ( ) { return x; };
protected:
const attribute x;
};

class Derived1 : public Base
{
public:
Derived1 ( ) : Base(SOME_ATTRIBUTE_1) { }
};

class Derived2 : public Base
{
public:
Derived2 ( ) : Base(SOME_ATTRIBUTE_2) { }
};

在这里,每个 Derived 都有一个对该类唯一的常量属性。如果愿意,您当然可以删除 const

关于C++每个派生类中的不同常量成员,如何移动函数以消除访问中的重复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5086896/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com