【问题标题】:Better way to initialize a "static const"-type variable member of a class in the main [duplicate]在主目录中初始化类的“静态常量”类型变量成员的更好方法[重复]
【发布时间】:2015-12-06 00:31:28
【问题描述】:

我有一个需要静态 const 变量成员的类。该类的值将在运行时由用户输入知道。我已经阅读了很多帖子,但到目前为止,没有一个解决方案有效。我知道这篇文章:

Can I initialize a static const member at run-time in C++?

包含一个变通方法,但它使用了一个我想避免的全局变量。而且它并不能真正解决问题。

考虑一下:

#include

class A {
  friend void foo(int);
    static int dummy;
public:
    static const int &T;
};

const int &A::T = A::dummy;
int A::dummy = 0;

void foo(int val) { A::dummy = val; }

int main() {
    foo(10);
    std::cout << A::T << std::endl;
    foo(12);
    std::cout << A::T << std::endl;
}

程序将编译并在控制台中写入10和12。 Wich 违背了 const 限定符的目的。这里的 const 是引用而不是值。所以我得出的结论是,在执行时不可能有一个静态的 const 类变量!

我知道另一种涉及创建设置类型类的方法,但它不是很整洁。

所以如果有人知道一个简单的解决方案,请告诉我们!

【问题讨论】:

  • 请提供一些您自己尝试过的代码以及您可能遇到的错误。在这一点上,您的问题非常广泛。请阅读stackoverflow.com/help/how-to-askstackoverflow.com/help/mcve 以提出更好的问题
  • @davejal 你读过这个问题吗?这不是我尝试的代码或我得到的错误的问题吗?我不觉得我的问题很广泛,对我来说很直接。但无论如何感谢您的反对,
  • 第一次你的问题以最好的方式开始(这会导致基于意见的答案),而不是开始你的问题的好方法。第二,您需要一个简单的解决方案(课程、教程或其他东西),而无需提供您自己尝试过的代码。很抱歉,但这值得我投超过 1 票。我只是想帮你问一个更好的问题。
  • 英语不是我的母语,也许我应该写更好的方式而不是最好的方式。我不是要求上课或教程类型的答案。只是一种更简单的方法。在什么提供代码将提供更好的答案?我只是想帮助您提出建设性意见。
  • 在什么方面提供代码会使我应该写一个更好的问题!

标签: c++ static initialization constants execution-time


【解决方案1】:

如果您不喜欢全局变量,您可以执行以下方案:

class A {
  friend void foo(int);
    static int dummy;
public: 
    static const int &T;
};

const int &A::T = A::dummy;
int A::dummy = 0;

void foo(int val) { A::dummy = val; }

int main() {
    foo(10);
    std::cout << A::T << std::endl;
}

Live Demo

这就是在你的类中将一个帮助器static int 变量声明为私有。让朋友成为改变该助手值的函数。

如果您只想初始化一次,可以将辅助函数更改为:

void foo(int val) { 
  static int count = 0;
  if(!count) A::dummy = val;
  ++count;
}

Live Demo

或者如果您不喜欢全局函数,您可以将上面显示的foo 函数设为A 的成员函数static,如下所示:

class A {
    static int dummy;
public: 
    static const int &T;
    static void foo(int val) { A::dummy = val; }
};

const int &A::T = A::dummy;
int A::dummy = 0;

int main() {
    A::foo(10);
    std::cout << A::T << std::endl;
}

Live Demo

【讨论】:

  • 此解决方案有效,但 foo 不是全局函数吗?所以它与链接中的解决方案几乎相同,但使用全局函数而不是全局变量?顺便说一句,不是我不喜欢全局变量,而是在我工作的环境中我不能使用它们。
【解决方案2】:

我在原始问题的链接和我得到的其他解决方案中提供的解决方案也有问题。考虑一下: #包括

class A {
  friend void foo(int);
    static int dummy;
public:
    static const int &T;
};

const int &A::T = A::dummy;
int A::dummy = 0;

void foo(int val) { A::dummy = val; }

int main() {
    foo(10);
    std::cout << A::T << std::endl;
    foo(12);
    std::cout << A::T << std::endl;
}

程序将编译并在控制台中写入10和12。 Wich 违背了 const 限定符的目的。这里的 const 是引用而不是值。所以我得出的结论是,在执行时不可能有一个静态的 const 类变量!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-06
    • 2021-08-07
    • 2013-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多