C++ constexpr变量的继承和设置
我正在尝试实现以下行为: 我有两个类,继承自同一个类。它们都将执行一些工作,在某个点上更改它们的状态,在某个点上,需要检查此状态。对于这两个类,检查是相似的,因为在这两个测试中,我们将实际状态与所需状态进行比较。唯一不同的是所需的状态,它依赖于类 在代码中,我如何实现这一点的一个简单示例如下:C++ constexpr变量的继承和设置,c++,inheritance,c++17,constexpr,C++,Inheritance,C++17,Constexpr,我正在尝试实现以下行为: 我有两个类,继承自同一个类。它们都将执行一些工作,在某个点上更改它们的状态,在某个点上,需要检查此状态。对于这两个类,检查是相似的,因为在这两个测试中,我们将实际状态与所需状态进行比较。唯一不同的是所需的状态,它依赖于类 在代码中,我如何实现这一点的一个简单示例如下: #include <iostream> class A { public: static int x = 1; int y; A(int _y): y(_y) {}
#include <iostream>
class A {
public:
static int x = 1;
int y;
A(int _y): y(_y) {}
void test() {
bool passed = x == y;
std::cout << "Test" << (passed ? "" : " not") << " passed\n";
}
};
class B : public A {
public:
B(int _y): A(_y)
{
x = 2;
}
};
class C : public A {
public:
C(int _y) : A(_y)
{
x = 3;
}
};
int main()
{
B b(2);
b.test(); // Test passed
C c(2);
c.test(); // Test not passed
return 0;
}
#包括
甲级{
公众:
静态int x=1;
int-y;
A(int y):y(y){
无效测试(){
bool passed=x==y;
std::cout模板似乎很有帮助,特别是当继承似乎只是在这里分解代码时:
template <int x>
class A {
public:
int y;
A(int _y): y(_y) {}
void test() {
bool passed = x == y;
std::cout << "Test" << (passed ? "" : " not") << " passed\n";
}
};
// using B = A<2>; // Seems even enough in your example
class B : public A<2> {
public:
using A<2>::A;
};
class C : public A<3> {
public:
using A<3>::A;
};
模板
甲级{
公众:
int-y;
A(int y):y(y){
无效测试(){
bool passed=x==y;
std::cout模板似乎很有帮助,特别是当继承似乎只是在这里分解代码时:
template <int x>
class A {
public:
int y;
A(int _y): y(_y) {}
void test() {
bool passed = x == y;
std::cout << "Test" << (passed ? "" : " not") << " passed\n";
}
};
// using B = A<2>; // Seems even enough in your example
class B : public A<2> {
public:
using A<2>::A;
};
class C : public A<3> {
public:
using A<3>::A;
};
模板
甲级{
公众:
int-y;
A(int y):y(y){
无效测试(){
bool passed=x==y;
std::谢谢!就一个问题,你说的“继承似乎只是在这里分解代码”是什么意思?@5xum:A
没有虚拟方法,所以你不能多态地使用B,C。类B
和C
相关吗(因为它们都是从A
继承的)它们现在不再从同一类继承,因此void test(A&);bb(42);cc(42);test(B);test(C);
或std::vector v{&B,&C}
不再是原来的样子了。好吧,A没有虚拟方法,因为我想写一个最小的工作示例。我的实际用例更复杂,并且确实包含虚拟方法。因此您可能需要调整我的解决方案(比如为A
提供基类)。谢谢!只需一个问题,您的意思是什么“继承似乎只是在这里分解代码”@5xum:A
没有虚拟方法,所以不能多态地使用B,C。类B
和C
相关吗(因为它们都是从A
继承的)?它们现在不再从同一个类继承,所以无效测试(A&);B(42);C(42);测试(B);测试(C)
或std::vector v{&b,&c}
已不再可能保持原样。好吧,A没有虚拟方法,因为我想编写一个最小的工作示例。我的实际用例更复杂,并且确实包含虚拟方法。因此,您可能需要调整我的解决方案(例如为A
设置基类)。