【问题标题】:How to initialize static constant member using function如何使用函数初始化静态常量成员
【发布时间】:2012-05-31 09:48:06
【问题描述】:

在一个非常简化的情况下,我有以下设置,我只想从 A 类的函数初始化一个常量静态成员(类 foo)(单例和实例与这个问题无关):

class A
{
public:

    static A instance;
    A & getInstance() { return instance; }
    int i(){ return 10;}
    int j(){ return 20;}
};

class foo {
public:

    static const int ii = A::getInstance().i() * A::getInstance().j(); 
};
const int foo::ii;

int main()
{
    foo f;
    return 1;
}

目的是使用上面的一些函数来初始化成员 ii。但它会产生以下错误:

$ c++ static_constant.cpp 
static_constant.cpp:14:30: error: ‘A::getInstance()’ cannot appear in a constant-expression
static_constant.cpp:14:42: error: a function call cannot appear in a constant-expression
static_constant.cpp:14:44: error: ‘.’ cannot appear in a constant-expression
static_constant.cpp:14:46: error: a function call cannot appear in a constant-expression
static_constant.cpp:14:53: error: ‘A::getInstance()’ cannot appear in a constant-expression
static_constant.cpp:14:65: error: a function call cannot appear in a constant-expression
static_constant.cpp:14:67: error: ‘.’ cannot appear in a constant-expression
static_constant.cpp:14:69: error: a function call cannot appear in a constant-expression

你能帮帮我吗?会很感激的。

【问题讨论】:

  • 查看此链接的评论stackoverflow.com/a/407753/720176
  • 真的看不出投反对票的原因。 @anDroider:也不要明白,链接的评论与问题有什么关系。你能解释一下吗?

标签: c++ linux static constants


【解决方案1】:

代码有几个问题,但这里有一个完整的可编译示例:

class A
{
public:

    static A instance;
    static A & getInstance() { return instance; }
    int i(){ return 10;}
    int j(){ return 20;}
};

class foo {
public:

    static const int ii;
};
const int foo::ii = A::getInstance().i() * A::getInstance().j(); 
A A::instance;

【讨论】:

  • 附带说明: 1. 单例类应该有一个私有构造函数。 2. 我知道实例化单例对象的推荐方法是 getInstance() 方法中:static A & getInstance() { static A theInstance; return theInstance; }
  • @g-makulik 更不用说首先使用单例了 :)
【解决方案2】:

您将getInstance 用作静态函数,但未声明static

更改getInstance的声明:

static A & getInstance() { return instance; }

【讨论】:

    猜你喜欢
    • 2012-07-16
    • 1970-01-01
    • 2015-02-18
    • 1970-01-01
    • 1970-01-01
    • 2012-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多