初始化初始化列表中的静态成员

时间:2015-11-26 15:45:14

标签: c++

如何使G::t静态? (例如,G::t的类型应为const static int&G::t由构造函数参数p定义,并且在其他任何位置都不可用。

class G {
public:
    // I want to make this static.
    const int& t;

    G(const int& p);
};

G::G(const int& p) : t(p) {}

int main() {
    int a=2;
    const int& b = a;

    G g = G(b);
}

3 个答案:

答案 0 :(得分:2)

e.g:

const int a = 10;

class foo
{
    static const constexpr int& t = a;
};

您无法在构造函数中初始化静态成员,因为构造函数用于对象,而不是整个类。

答案 1 :(得分:0)

如果要将静态成员设置为静态函数使用,为什么还要使用构造函数?这不是构造函数的用途。你肯定无法初始化初始化列表中的静态成员,因为这意味着每次构造另一个对象时它都会被初始化。 (想想每个类静态数据和每个实例数据之间的区别,这个问题显而易见的原因应该很明显。)

您可以使用静态本地,它在首次使用时初始化,因此可以在运行时初始化,然后可以通过静态成员函数访问:

class G {
public:
    static int t(const int& p = 0, bool set = false);

    G(const int& p);
};

G::G(const int& p) { t(p, true); }

int G::t(const int& p, bool set)
{
    static bool is_set = false;
    if (!is_set)
    {
        if (!set)
            throw std::logic_error("Cannot use G::t before it is set");
    }
    else if (set)
        throw std::logic_error("Cannot set G::t more than once");
    static const int tt = p;
    set = true;
    return tt;
}

int main() {
    int a=2;
    const int& b = a;

    G g = G(b);
    int t = G::t();
}

但这是一个可怕的黑客,你应该仔细考虑你的设计,在这里使用构造函数是否合适,或者即使使用类是合适的。

答案 2 :(得分:0)

成员初始值设定项列表只能用于初始化实例变量,因此如果t是静态的,则只能在构造函数体中重新分配

因为无法重新分配引用,所以必须使用指针。 reference_wrapper不起作用,因为它需要静态初始化(除非你有一个可用于此的全局int)。

E.g。

class G {
public:
    static const int* t;

    G(const int& p);
};

const int* G::t; // definition in .cpp

G::G(const int& p) {
    t = &p;
}