【问题标题】:c++ reset default array length within class constructorc ++在类构造函数中重置默认数组长度
【发布时间】:2013-03-21 02:58:08
【问题描述】:

给定类定义如下:

struct A {
   std::vector<int> aList;
   A() {
     for (int i = 0; i < ARRAY_LENGTH; i++)
       aList.push_back(0);
   }
}

程序的其他部分需要 A 的无参数构造函数。是否可以让 ARRAY_LENGTH 变化(比如从外部文件读取/从 gui 修改),以便

  • 第 0 步:ARRAY_LENGTH = 10
  • 第一步:创建A的对象,aList.size()初始化为10。
  • 第二步:使用A新创建的对象
  • 第 3 步:删除所有以前创建的 A 对象
  • 步骤 4:使用不同的 ARRAY_LENGTH 值重复步骤 0 到 4,直到程序结束

ARRAY_LENGTH 的修改可以来自外部文件,也可以通过 gui 修改。并且程序的任何其他部分都不应该对该值具有写访问权。我怎样才能达到这个要求?

编辑:为了销毁现有对象,它将由程序的其他部分处理

Edit(2):我在做一个模拟项目,A类中的aList代表家庭规模可能的pdf值。 (假设 aList[0] = 0.5,aList[1] = 0.2,aList[3] = 0.3)。只有在程序运行不同的场景时才会发生最大家庭规模的变化,这意味着我将销毁之前创建的A的对象以重置模拟。

【问题讨论】:

  • 在查看问题的其余部分之前,该代码应该是(在 C++03 中):A() : aList(ARRAY_LENGTH) {}
  • 为什么不直接将所需的大小传递给构造函数?
  • 我会说通过构造函数传递ARRAY_LENGTH 并在您想要更改它时创建一个新对象(看看您如何摆脱它们)。当然可以调整,但这似乎是您所描述的最简单的方法。
  • 是否可以在main() 开始之前创建A 对象?如果是这样,事情就会变得棘手。
  • 听起来array_length应该是A的静态数据成员。你甚至可以在main之前初始化它,然后随时更改它。另一方面,没有安全的方法来销毁所有预先存在的 As。

标签: c++ constructor global-variables


【解决方案1】:

我不确定您对无参数构造函数的要求,这似乎是一个设计弱点,但这里是 cmets 中建议的静态默认长度方法的实现

struct A {
   private static DefaultLength=ARRAY_LENGTH;

   public static ResetDefault(int newDefault) {
         DefaultLength=newDefault;
   }

   std::vector<int> aList;

   A() {
     for (int i = 0; i < DefaultLength; i++)
       aList.push_back(0);
   }
}

这种性质的对象将正确地解除分配。

【讨论】:

    【解决方案2】:

    其中一种方法是您可以使用外部 xml 文件来指定 ARRAY_LENGTH 的值;但这将涉及在代码中包含 xml 文件并对其进行解析以获取变量 ARRAY_LENGTH 的值的开销

    例如,您的 xml 文件可能如下所示:-

    < xml version="1.0" encoding="UTF-8" standalone="no" ?> 
    -< root>
            < LEN_VAR ARRAY_LENGTH=10/>
    < /root>
    

    然后,您需要在代码中包含并编译 C/c++ 的 xml 解析器。 (各种解析器免费提供:例如 http://biocpp.sourceforge.net/download/xmlParser.cpp ) 然后,您必须在创建此类的对象之前获取值 ARRAY_LENGTH。

    您无需重新编译即可更改 xml 代码中的值。

    将修改通知存档将让您知道您的值何时更改,并且一旦您从 XML 文件中重新读取新值,您的程序就可以继续使用新值。我不确定您使用的是什么平台,但您可以查看How do I create a file listener in linux?How do I make my program watch for file modification in C++? 以获取文件更改通知。

    【讨论】:

    • 正如我所说,外部文件是一个选项来指定ARRAY_LENGTH的值,而我想要实现的是让ARRAY_LENGTH在程序运行时发生变化。
    猜你喜欢
    • 2011-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-15
    • 1970-01-01
    • 2021-09-04
    相关资源
    最近更新 更多