首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重写静态成员和“静态静态数组”

问重写静态成员和“静态静态数组”
EN

Stack Overflow用户
提问于 2010-11-11 23:07:32
回答 2查看 311关注 0票数 0

我在“覆盖”静态数组时遇到了一个棘手的问题。我在不同的派生类中有固定长度的静态数组(为简单起见),但所有大小在编译时都是已知的。我在基类中也有一个虚函数,但我不知道如何解决在派生类中重写这些数组和数组大小的问题,以便这个虚函数正确工作,即从派生类中提供大小和数组内容。示例:

代码语言:javascript
复制
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可以做到这一点(?),但需要做很多工作才能适应我现有的代码。非常感谢,彼得

EN

回答 2

Stack Overflow用户

发布于 2010-11-11 23:31:14

因为f只在Base类中定义,所以它将使用该类的n变量。

也许可以移动一下:

代码语言:javascript
复制
for(int i = 0; i < n; ++i) 
  { 
   // do something with n and da 
   std::cout << n << std::endl; 
  }

添加到一个单独的函数中,而不是使用它,这样您就可以传入"n“是什么。喜欢

代码语言:javascript
复制
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个变量。

票数 1
EN

Stack Overflow用户

发布于 2010-11-11 23:43:34

您可以使用奇怪的循环模板模式来使您的函数访问派生次数最多的类中的静态数组。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4155809

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档