【问题标题】:Declare class object with parameters without using if...else使用参数声明类对象而不使用 if...else
【发布时间】:2013-02-12 20:35:37
【问题描述】:

我是 C++ 新手,尝试编写一个缓存模拟器。 CACHE 类的构造函数是

CACHE (int, int, int, int, CACHE *);   //declare

main() 中,我正在尝试根据某个变量创建对象:

int main()
{
       if ( L2_size == 0 )      //only one level of cache   
       {
        CACHE L1(L1_size, blocksize, L1_assoc, inclusion, 0);
       }
       else                     //2 level of caches
       {
        CACHE L2(L2_size, blocksize, L2_assoc, inclusion, 0);
        CACHE L1(L1_size, blocksize, L1_assoc, inclusion, &L2);
       }
}

问题在于我无法访问 L1 和 L2,因为它们的范围在 if...else 内。

此外,我尝试过使用 ? : 运营商实现这一点,仍然得到错误:

三元运算符不匹配。

有没有办法做到这一点?谢谢!

【问题讨论】:

  • 包括一个如何使用L2L1 的示例。例如,如果L2_size == 0,则没有L2,那么尝试使用L2 的代码会发生什么?或者这只是关于L1
  • 你看过这篇文章了吗? stackoverflow.com/questions/1917718/…
  • 如果L2_size == 0,则没有L2缓存的对象

标签: c++


【解决方案1】:

可能是这样的:

    CACHE *L2 = 0;
    CACHE *L1 = 0;


    if (L2_size)
    {
        L2 = new CACHE(L2_size, blocksize, L2_assoc, inclusion, 0);
    }
    L1 = new CACHE(L1_size, blocksize, L1_assoc, inclusion, L2);  

我确信还有其他可能性。

【讨论】:

  • 谢谢垫子。根据您的代码,L1 似乎总是指向 L2。
  • +1,而@ARGOS 不是。 *L2 为 0(空),除非 L2_size 具有非零性质,创建一个新的 CACHE 并将其分配给 *L2。如果 L2_size 为零,则在创建 L1 时 *L2 将为 NULL,这正是您想要的。
【解决方案2】:

您可以在 if 语句之前使用诸如 std::liststd::vector 之类的容器,并根据需要 push_back 尽可能多的 CACHE 对象。

例子:

int main()
    {
       std::list<CACHE> caches;
       if (L2_size == 0)
       {
          caches.push_front(CACHE(L1_size, blocksize, L1_assoc, inclusion, 0));
       }
       else
       {
          caches.push_front(CACHE(L2_size, blocksize, L2_assoc, inclusion, 0);
          caches.push_front(CACHE(L1_size, blocksize, L1_assoc, inclusion, &(*caches.begin());
       }
    }

无论您使用哪种方法,想法都是在您的 if 语句之前创建堆栈变量(listpointer 或其他),以便它保持在范围内。

【讨论】:

  • @Mats 已编辑。新版好用吗?它完成了这项工作,虽然它只适用于两级缓存场景,但这正是 OP 想要的。
  • @Mats Petersson,L2的地址传给L1,L1中有一个CACHE指针,指向L2
  • @ARGOS Mats 指的是我的预编辑版本,它忽略了将 L2 的地址传递给 L1。
  • 是的,可以。但是,没有必要这样做,因为 L1 有一个指向 L2 的指针,所以你不需要将它推送到列表中...... ;)
  • @Mats 真。我只选择了列表,这样容器就不必调整大小了。此外,我一开始并没有意识到缓存需要相互指向,因此列表似乎是一个不错的通用解决方案(即它可以简单地扩展为包含两个以上的缓存)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-03
  • 1970-01-01
  • 2019-07-07
  • 1970-01-01
  • 2021-11-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多