我在“覆盖”静态数组时遇到了一个棘手的问题。我在不同的派生类中有固定长度的静态数组(为简单起见),但所有大小在编译时都是已知的。我在基类中也有一个虚函数,但我不知道如何解决在派生类中重写这些数组和数组大小的问题,以便这个虚函数正确工作,即从派生类中提供大小和数组内容。示例:
class B {
private:
// these two are not really meaningful in this class (ABC)
static const int n = 1;
static double da[n];
public:
virtual void f()
{
for(int i = 0; i < n; ++i)
{
// do something with n and da
std::cout << n << std::endl;
}
}
};
class D1 : public B {
private:
// these are subclass-specific (i.e. n might also change)
static const int n = 4;
static double da[n];
};
class D2 : public B {
private:
// these are subclass-specific (i.e. n might also change)
static const int n = 6;
static double da[n];
};
double D1::da[] = {1., 2., 3., 4.};
// ...
int main()
{
B *p = new D;
p->f(); // I'd like to see 4 instead of 1
}你能建议一个正确的修复方法或不同的方法吗?我认为std::vector可以做到这一点(?),但需要做很多工作才能适应我现有的代码。非常感谢,彼得
发布于 2010-11-11 23:31:14
因为f只在Base类中定义,所以它将使用该类的n变量。
也许可以移动一下:
for(int i = 0; i < n; ++i)
{
// do something with n and da
std::cout << n << std::endl;
}添加到一个单独的函数中,而不是使用它,这样您就可以传入"n“是什么。喜欢
void doStuff(int num) {
for(int i = 0; i < num; ++i)
{
// do something with n and da
std::cout << num << std::endl;
}
}并让每个子类实现f()来调用doStuff(n),其中n将是每个类自己的n个变量。
发布于 2010-11-11 23:43:34
您可以使用奇怪的循环模板模式来使您的函数访问派生次数最多的类中的静态数组。
https://stackoverflow.com/questions/4155809
复制相似问题