如何使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);
}
答案 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;
}