如何根据用户设置的初始变量设置一组常量值

时间:2017-02-17 12:08:26

标签: c++ arrays constants

我程序的输出是一个数组,该数组的大小基于用户输入。 但是要设置数组的大小,我需要常量。

因此,一个解决方案是让用户在编译/运行之前设置常量。

const int test1 = 10;
const int test2 = 20;
std::string TestArray[test1][test2];

然而,除了数组的2个常量之外,还有几个常量需要设置,所以理想情况下用户只需要设置1个变量,然后根据使用这样的开关设置常量:

const int number = 2;
int test1a;
int test2a;
switch (number)
{
case 1:
    test1a = 10;
    test2a = 10;
    test3a = 123;
    break;
case 2:
    test1a = 20;
    test2a = 20;
    test3a = 456;
    break;
}
const int test1 = test1a;
const int test2 = test2a;
std::string TestArray[test1][test2];
test2 = 50;

然而,这给了test1和test 2的错误,"表达式必须具有一个常数值"设置数组时。但是在尝试设置test2 = 50之后的行给出了错误"表达式必须是可修改的Ivalue"

正在设置的数据是建筑信息。 因此,第1组将用于具有x层,y人等的普通办公楼 第2组普通酒店 第3组平均住宅区 等

4 个答案:

答案 0 :(得分:2)

您无法在功能之外使用切换,无论如何您使用的解决方案都是错误的。您的问题的解决方案是创建一个动态数组,尝试使用Google搜索并询问您之后是否有任何问题。

编辑:

   #define number 2
   #if number == 2
   const int test2 = 10
   #else
   const int test2 = 20
   #endif

答案 1 :(得分:2)

您可以使用模板,例如:

template <std::size_t> struct config;

template <> struct config<1>
{
    static constexpr int test1a = 10;
    static constexpr int test2a = 10;
    static constexpr int test3a = 123;
};

template <> struct config<2>
{
    static constexpr int test1a = 20;
    static constexpr int test2a = 20;
    static constexpr int test3a = 456;
};

constexpr std::size_t number = 2;
const int test1 = config<number>::test1a;
const int test2 = config<number>::test2a;

答案 2 :(得分:1)

  

因此,一个解决方案是让用户在它们之前设置常量   编译/运行。

必须在编译时知道数组大小。但是,您可以使用编译时开关(使用 class-templates ):

完整示例:

#include <string>

template<int>
struct Switch{};

template<>
struct Switch<1>{
    static constexpr int test1a = 10;
    static constexpr int test2a = 10;
    static constexpr int test3a = 123;
};

template<>
struct Switch<2>{
    static constexpr int test1a = 20;
    static constexpr int test2a = 20;
    static constexpr int test3a = 456;
};

int main(){
    constexpr int number = 2;    //Change to 1 if you require the other.
    constexpr int test1 = Switch<number>::test1a;
    constexpr int test2 = Switch<number>::test1a;

    std::string TestArray[test1][test2];
}

Live On Coliru

答案 3 :(得分:1)

尝试使用指向对象数组或指针数组的指针,而不是使用固定大小的对象数组,然后根据用户的输入分配内存。

int number={0};
cin >> number;
int* array{new int{number}};

但是你的代码问题在于它更多采用C风格的编程。这可以使用std :: vector或使用类更容易地完成。