多个 类 需要访问静态变量
Multiple classes need access to a static variable
我们有 classes A、B 和 C,它们都需要访问 class D 中的静态变量 staticVariable
。
此外,class A 需要有一个 classes B 和 C 的实例,如下所示:
class A{
public:
B instanceB;
C instanceC;
};
Class D 保存对象类型的静态变量T
:
class D{
public:
D() {
staticVariable.init();
};
static T staticVariable;
};
示例中classes B和C可以为空占位符classes:
class B{
};
class C{
};
main函数创建了A的一个实例:
int main(){
A a;
/*...*/
}
同样,classA、B 和 C 需要访问 staticVariable
。我尝试了多种方法,包括继承和友元函数,但我总是遇到依赖问题或链接器错误,我不太明白:
Error LNK2001 unresolved external symbol "public: static class T
D::staticVariable" (?window@D@@2VT@sf@@A) SortingAlgorithms
C:\Users\Dusan\source\repos\SortingAlgorithms\SortingAlgorithms\B.obj
在 classes A、B 和 C 的 .obj 文件中报告。
我不确定 main
中是否需要 D
的实例。
我如何实现这个无错误?
对于调用初始化函数的 static
个对象,你是如何做到的?
我的意思是,如果该函数与您要初始化的对象相同 class,并且是非静态的,我似乎无法调用 staticVariable.init();
// in D.hpp
class D {
public:
D() { ... }; // staticVariable is static, so the ctor has no business initializing it
void init();
static int staticVariable;
static D staticD;
};
// in D.cpp
#include "D.hpp"
int D::staticVariable = 10;
// Immediatly invoked initializing lambda expression
D D::staticD = []{ D tmp; tmp.init(); return tmp; }();
I'm not sure if I need an instance of D in main.
你不知道。 static
变量是全局变量,它们由同一 class 的所有实例共享,您无需实例化 class 即可使用此类变量,因此必须对其进行初始化不管 class 实例化。既然如此,它们需要在 class.
之外进行初始化
How do I implement this error-free?
类似于:
class B{};
class C{};
class A{
public:
B instanceB;
C instanceC;
};
class D{
public:
D(){};
static int staticVariable;
};
int D::staticVariable = 10; //<-- here, outside the class
int main()
{
//no instance of D needed
std::cout << D::staticVariable; // prints 10
D::staticVariable++;
std::cout << D::staticVariable; // prints 11
}
And how do you do it for static
objects that call a function for initialization?
I meant if the function is of the same class as the object you're trying to initialize, and is non-static, I can't seem to be able to call staticVariable.init();
也是一样的道理,你在class里面声明对象静态,在外面初始化:
class A{
public:
void init(){std::cout << "Do Something";} //non-static method
};
class D{
public:
static A obj; //declare
};
A D::obj{}; //<-- initialize outside the class
int main()
{
D::obj.init(); // prints 'Do Something'
}
我们有 classes A、B 和 C,它们都需要访问 class D 中的静态变量 staticVariable
。
此外,class A 需要有一个 classes B 和 C 的实例,如下所示:
class A{
public:
B instanceB;
C instanceC;
};
Class D 保存对象类型的静态变量T
:
class D{
public:
D() {
staticVariable.init();
};
static T staticVariable;
};
示例中classes B和C可以为空占位符classes:
class B{
};
class C{
};
main函数创建了A的一个实例:
int main(){
A a;
/*...*/
}
同样,classA、B 和 C 需要访问 staticVariable
。我尝试了多种方法,包括继承和友元函数,但我总是遇到依赖问题或链接器错误,我不太明白:
Error LNK2001 unresolved external symbol "public: static class T
D::staticVariable" (?window@D@@2VT@sf@@A) SortingAlgorithms
C:\Users\Dusan\source\repos\SortingAlgorithms\SortingAlgorithms\B.obj
在 classes A、B 和 C 的 .obj 文件中报告。
我不确定 main
中是否需要 D
的实例。
我如何实现这个无错误?
对于调用初始化函数的 static
个对象,你是如何做到的?
我的意思是,如果该函数与您要初始化的对象相同 class,并且是非静态的,我似乎无法调用 staticVariable.init();
// in D.hpp
class D {
public:
D() { ... }; // staticVariable is static, so the ctor has no business initializing it
void init();
static int staticVariable;
static D staticD;
};
// in D.cpp
#include "D.hpp"
int D::staticVariable = 10;
// Immediatly invoked initializing lambda expression
D D::staticD = []{ D tmp; tmp.init(); return tmp; }();
I'm not sure if I need an instance of D in main.
你不知道。 static
变量是全局变量,它们由同一 class 的所有实例共享,您无需实例化 class 即可使用此类变量,因此必须对其进行初始化不管 class 实例化。既然如此,它们需要在 class.
How do I implement this error-free?
类似于:
class B{};
class C{};
class A{
public:
B instanceB;
C instanceC;
};
class D{
public:
D(){};
static int staticVariable;
};
int D::staticVariable = 10; //<-- here, outside the class
int main()
{
//no instance of D needed
std::cout << D::staticVariable; // prints 10
D::staticVariable++;
std::cout << D::staticVariable; // prints 11
}
And how do you do it for
static
objects that call a function for initialization?
I meant if the function is of the same class as the object you're trying to initialize, and is non-static, I can't seem to be able to callstaticVariable.init();
也是一样的道理,你在class里面声明对象静态,在外面初始化:
class A{
public:
void init(){std::cout << "Do Something";} //non-static method
};
class D{
public:
static A obj; //declare
};
A D::obj{}; //<-- initialize outside the class
int main()
{
D::obj.init(); // prints 'Do Something'
}