Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使虚拟函数接受仅在派生类中定义的数据类型? 我有一个C++类,它有两个虚函数,它们使用未定义的状态< /C>结构>作为返回/参数类型。我的问题是状态结构只在派生类中定义,而基类对此一无所知 类基{ //错误:标识符“状态”未定义 虚拟空序列化(状态和最后状态)=0; 虚拟状态&getCurrentState()=0; }; 派生类:公共基{ 结构状态{//每个派生类都有不同的状态字段 int32_t x=0; int32_t y=0; }当前状态; 无效序列化(状态和最后状态)覆盖; State&getCurrentState()覆盖; }_C++_Oop_Inheritance - Fatal编程技术网

如何使虚拟函数接受仅在派生类中定义的数据类型? 我有一个C++类,它有两个虚函数,它们使用未定义的状态< /C>结构>作为返回/参数类型。我的问题是状态结构只在派生类中定义,而基类对此一无所知 类基{ //错误:标识符“状态”未定义 虚拟空序列化(状态和最后状态)=0; 虚拟状态&getCurrentState()=0; }; 派生类:公共基{ 结构状态{//每个派生类都有不同的状态字段 int32_t x=0; int32_t y=0; }当前状态; 无效序列化(状态和最后状态)覆盖; State&getCurrentState()覆盖; }

如何使虚拟函数接受仅在派生类中定义的数据类型? 我有一个C++类,它有两个虚函数,它们使用未定义的状态< /C>结构>作为返回/参数类型。我的问题是状态结构只在派生类中定义,而基类对此一无所知 类基{ //错误:标识符“状态”未定义 虚拟空序列化(状态和最后状态)=0; 虚拟状态&getCurrentState()=0; }; 派生类:公共基{ 结构状态{//每个派生类都有不同的状态字段 int32_t x=0; int32_t y=0; }当前状态; 无效序列化(状态和最后状态)覆盖; State&getCurrentState()覆盖; },c++,oop,inheritance,C++,Oop,Inheritance,虚拟数据成员不是一件事,所以我假设我不能两次定义一个结构。我还认为,也许我可以创建一个空的基结构,并让每个派生类的状态继承自它,但这似乎不是一个非常干净的解决方案 如果有一种完全不同的方式来解决这个问题,我将尝试做些什么: 我有一个从基继承的对象映射(std::无序映射) 虚拟数据成员不是一件事,所以我假设我不能两次定义一个结构。我还认为也许我可以创建一个空的基本结构,并让每个派生类的状态从中继承,但这似乎不是一个非常干净的解决方案 这确实是您应该做的。我认为它更干净,当您在base中将基态声明

虚拟数据成员不是一件事,所以我假设我不能两次定义一个结构。我还认为,也许我可以创建一个空的基结构,并让每个派生类的状态继承自它,但这似乎不是一个非常干净的解决方案

如果有一种完全不同的方式来解决这个问题,我将尝试做些什么:

我有一个从基继承的对象映射(
std::无序映射)
虚拟数据成员不是一件事,所以我假设我不能两次定义一个结构。我还认为也许我可以创建一个空的基本结构,并让每个派生类的状态从中继承,但这似乎不是一个非常干净的解决方案

这确实是您应该做的。我认为它更干净,当您在
base
中将基态声明为受保护类时

类基{
受保护的:
结构状态{};
公众:
虚拟空序列化(状态和最后状态)=0;
虚拟状态&getCurrentState()=0;
};
派生类:公共基{
公众:
结构状态:Base::State{//每个派生类都有不同的状态字段
int32_t x=0;
int32_t y=0;
}当前状态;
void serialize(Base::State&last_State)override;//注意Base::很重要,否则函数不会重写
State&getCurrentState()override;//您可以将Base::添加到返回类型中,但不必这样做。
};
虚拟数据成员不是一件事,所以我假设我不能两次定义一个结构。我还认为也许我可以创建一个空的基本结构,并让每个派生类的状态从中继承,但这似乎不是一个非常干净的解决方案

这确实是您应该做的。我认为它更干净,当您在
base
中将基态声明为受保护类时

类基{
受保护的:
结构状态{};
公众:
虚拟空序列化(状态和最后状态)=0;
虚拟状态&getCurrentState()=0;
};
派生类:公共基{
公众:
结构状态:Base::State{//每个派生类都有不同的状态字段
int32_t x=0;
int32_t y=0;
}当前状态;
void serialize(Base::State&last_State)override;//注意Base::很重要,否则函数不会重写
State&getCurrentState()override;//您可以将Base::添加到返回类型中,但不必这样做。
};

调用
getCurrentState
不是为了序列化吗?能否将
serialize
更改为不接受任何参数,以便每个派生类将序列化自己的状态?对象将自身序列化为不同的状态是否有意义?您打算如何使用返回的
状态通过
getCurrentState
如果你不知道它有哪些成员?我将从
getCurrentState
返回的状态传递给一个重载函数。至于
serialize
,我可能会创建一个不带任何参数的函数的单独版本。这个重载函数如何知道哪些成员e> 状态
has?在你的(假设的)方法中,知道它的唯一方法是知道“所有者”的确切类型除了序列化之外,是否调用了
getCurrentState
?能否将
serialize
更改为不接受任何参数,以便每个派生类将序列化其自己的状态?对象将自身序列化为不同的状态是否有意义?您打算如何使用返回的
状态
e> getCurrentState
如果您不知道它有哪些成员?我将从
getCurrentState
返回的状态传递给一个重载函数。至于
serialize
,我可能可以创建一个不带任何参数的函数的单独版本。这个重载函数如何知道
状态的成员
has?在你的(假设的)方法中,知道它的唯一方法是知道“所有者”的确切类型“你不能继承私有函数”-你可以覆盖私有
virtual
函数“你不能继承私有函数”-你可以覆盖私有
virtual
函数