在继承类中扩展结构
Extend struct in inheriting class
是否可以在父类中声明结构并在继承子类中定义它(在每个子类中,它看起来应该不同(?
一个例子如下:
class parent
{
virtual struct AlwaysDifferentStructure;
//Some methods here
//...
};
class child1 : public parent
{
struct AlwaysDifferentStructure
{
int foo;
}
//Some methods here
//...
};
class child2 : public parent
{
struct AlwaysDifferentStructure
{
char* foo;
float bar;
double foobar;
}
//Some methods here
//...
};
因此,实际上我正在尝试处理以下问题:我得到了一个父类shader
和许多继承类(即simple_color_shader
(。每个着色器都有自己的顶点结构。现在我想用其中一个着色器渲染一个对象,但我不知道顶点结构到底是什么样子,因为它总是不同的,但我需要它。所以我想我可以在所有子对象中重新声明结构,并通过父对象获得访问权限。所以在object
类中,它基本上看起来是这样的:
class object
{
parent* m_pParent;
AlwaysDifferentStructure* m_structArray;
};
(问问你是否不明白我想告诉你的话;我的英语不太好(
我的问题是:这可能吗?如果可能的话,如果有人能告诉我怎么做,我将不胜感激。
类似的事情可以用奇怪的重复模板模式来完成
template <typename derived>
class parent
{
void someMethod ()
{
typename derived::AlwaysDifferentStructure x;
x.foo;
}
};
class child1 : public parent <child1>
{
struct AlwaysDifferentStructure
{
int foo;
}
//Some methods here
//...
}
class child2 : public parent <child2>
{
struct AlwaysDifferentStructure
{
char* foo;
float bar;
double foobar;
}
//Some methods here
//...
}
由于OP发现评论中发布的片段是很好的建议,我将它们发布在这里,以供未来的读者使用
以下是一种可能的方法,如评论中所述:
class parent { };
class child1 : public parent { };
class child2 : public parent { };
template<typename>
struct AlwaysDifferentStructure;
template<>
struct AlwaysDifferentStructure<child1> {
int foo;
};
template<>
struct AlwaysDifferentStructure<child2> {
char* foo;
float bar;
double foobar;
};
int main() {
AlwaysDifferentStructure<child1> c1t;
c1t.foo = 42;
AlwaysDifferentStructure<child2> c2t;
c2t.foo = new char{'c'};
c2t.bar = .42;
c2t.foobar = 0.;
}
作为另一个可行的解决方案,您可以这样做:
class parent {
//Some methods here
//...
};
class child1 : public parent {
public:
auto alwaysDifferentStructure() {
struct S {
int foo;
} s;
return s;
}
};
class child2 : public parent {
public:
auto alwaysDifferentStructure() {
struct S {
char* foo;
float bar;
double foobar;
} s;
return s;
}
};
int main() {
auto c1t = child1{}.alwaysDifferentStructure();
c1t.foo = 42;
auto c2t = child2{}.alwaysDifferentStructure();
c2t.foo = new char{'c'};
c2t.bar = .42;
c2t.foobar = 0.;
}
请注意,第二个示例需要C++14。
相关文章:
- 如何使用静态变量,使用自定义Getter和设置器在SWIG中扩展结构
- 如何使用空的"null"或"空"元素扩展C++结构/类
- 结构化绑定中的const引用扩展了分解对象的寿命
- NUMA体系结构上大(8MB)内存区域的可扩展分配
- 扩展Windows API结构是安全的吗?
- 扩展typedef结构(与VC++11兼容)
- 在c++中初始化扩展结构
- 未记录的GCC扩展:结构中的VLA
- 我的火狐扩展程序不起作用。使用C++XPCOM组件的Firefox扩展(XPI文件)的结构是什么?
- 完成关键与扩展重叠结构
- 扩展树结构的序列化
- Cython 扩展类:如何在自动生成的 C 结构中公开方法
- 扩展类/结构C++数据成员的更好方法
- Python扩展模块包结构(命名空间)
- 使用从结构体扩展的符号
- 在c++中扩展C结构
- 在继承类中扩展结构
- 结构扩展结构的静态初始化
- 扩展向量迭代器以访问所包含类/结构的数据成员
- 复杂的数据结构,同时嵌入扩展 Python 与C++