【问题标题】:How can I declare a member reference to a member static array in C++如何在 C++ 中声明对成员静态数组的成员引用
【发布时间】:2021-06-09 23:23:12
【问题描述】:

我在头文件中设置了一些遗留代码

class Foo
{
    static double Params[];
}

并且在源文件中声明为

double Foo::Params[] = { 1, 2 };

然后在各种类函数中它被引用为

Params[0] = userValue;  // Change value in position 0.

现在我的任务是添加更多的 Params 数组,以便拥有

class Foo
{
    static double Params1[];
    static double Params2[];
}

double Foo::Params1[] = { 1, 2 };
double Foo::Params2[] = { 3, 4 };

我不想在代码的任何地方都这样做来混淆源代码

if (something) 
  Params1[0] = userValue;
else
 Params2[0] = userValue;

所以我想声明一个对数组的引用,并在设置“某些东西”时更改 Params 数组之间的引用,以便我使用正确的参数来读取/写入。我试过了

class Foo
{
    static double Params1[];
    static double Params2[];
    static double (&Params)[];
    double(&NonStaticParamsTest)[];
}

double Foo::Params1[] = { 1, 2 };
double Foo::Params2[] = { 3, 4 };
double Foo::Params[] = Foo::Params1;  // Won't compile

Foo::Foo()  // Constructor
    NonStaticParamsTest(Params1),   // Also won't compile

// I'd like to switch between Params by moving the reference like this
if (something)
    Params = Params1;
else
    Params = Params2;

我已经尝试对引用的静态和非静态尝试的语法进行各种更改,但我只是不完全在那里。

我已经查看了这个答案,但该示例不涉及类或静态变量,因此即使尝试使用自动变量,我也无法完全得到公认的答案。 When Declaring a Reference to an Array of Ints, why must it be a reference to a const-pointer?

我正在尝试做的事情是否可行,或者它不适用于静态数组和类?

【问题讨论】:

  • C++ 训练我们所有人都非常区分大小写。 Class 显然是错误的。
  • 我不确定这是否可行。数组不能通过赋值来调整大小。你可能需要std::vector
  • 数组不会被调整大小,它们都是相同的大小。我会将它们更改为向量,除非它们在实际代码中非常大,并且使用像数组这样的值预先填充向量并不容易。所以我不想每次为几十个条目手动初始化向量 1 行。因此数组方法,因为它很好地初始化并且当有人试图查看它是如何填写时很容易阅读。
  • 你确实意识到你可以用同样的方式初始化std::vector 完全,我希望。差异几乎是不可见的,尤其是对于使用它的其他代码,a[x] 工作方式相同。
  • 嗯,我想我已经习惯了 C11 之前的标准这么多年了,以至于我没有意识到你现在可以像这样初始化向量。我只是快速将代码更改为向量并添加了一个非静态引用,并且编译得很好。感谢您的提示。

标签: c++ arrays class reference static


【解决方案1】:

所以我想声明一个对数组的引用,并在设置“某物”时更改 Params 数组之间的引用,以便我使用正确的参数来读取/写入。

一个引用一旦被初始化就不能被反弹,所以当Params是一个引用时这将不起作用:

if (something)
    Params = Params1;
else
    Params = Params2;

您需要一个指针,例如以下将起作用:

class Foo
{
public:
    static double Params1[];
    static double Params2[];
    static double (*StaticParams)[2];
    double (*NonStaticParams)[2];

    Foo();
    void doSomething();
};

double Foo::Params1[] = { 1, 2 };
double Foo::Params2[] = { 3, 4 };
double (*Foo::StaticParams)[2] = &Foo::Params1;

Foo::Foo()
    : NonStaticParams(&Params1)
{
}

...

if (something)
    Foo::StaticParams = &Foo::Params1;
else
    Foo::StaticParams = &Foo::Params2;

(*Foo::StaticParams)[0] = ...;
(*Foo::StaticParams)[1] = ...;

...

void Foo::doSomething()
{
    ...

    if (something)
        NonStaticParams = &Params1;
    else
        NonStaticParams = &Params2;

    (*NonStaticParams)[0] = ...;
    (*NonStaticParams)[1] = ...;

    ...
}

Demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多