所以这是我的课程:
class A
{
public:
static MyObject *getObject(std::string string)
{
if(string == "string1")
return object1;
else if(string == "string2");
return object2;
else
return object3;
}
static MyObject *object1;
static MyObject *object2;
static MyObject *object3;
}
#include "A.h"
class B
{
public:
void initMethod();
void myMethod();
}
//B.cpp file
#include "B.h"
void B::init()
{
A::object1 = new MyObject();
A::object2 = new MyObject();
A::object3 = new MyObject();
}
void B::myMethod
{
MyObject *currentObject = A::getObject("string1");
//Do stuff with MyObject
}
正如您所看到的,我首先尝试初始化B内部的A成员,然后在不同的函数中访问这些成员。但是,每次我尝试访问B中的A类数据时,我都会得到一个“未定义的符号,用于架构x86_64”编译器错误,我似乎无法弄清楚原因。我做错了什么?
答案 0 :(得分:0)
您的代码有几处错误:
Class B
,应为class B
initMethod
和myMethod
在他们之后缺少()
static
中的A
成员必须在源(.cpp)文件中定义,否则会出现链接器错误。所以对于前。在您的main.cpp
文件中,您必须定义它们
MyObject* A::object1 = new MyObject(/*param*/);
//others
修改强>
根据OP的评论,我认为您应该了解对象生存期和变量范围。您可以查看以下链接1,2,3。您还可以搜索更多内容。特别是,static
变量一旦创建就具有整个程序生命周期的生命周期。因此,在输入方法后,方法中声明的static
变量具有生命周期,创建变量,然后直到程序终止。类级别,全局static
变量具有在main
之前(或在程序执行开始之前)开始的生命周期,并且在程序终止之前保持活动状态。在您的情况下,由于您在类级别创建static
变量,编译器将尝试在程序启动之前将它们保留在内存中,为此,它们必须在可访问区域中可见/定义。这就是为什么你必须在你的成员方法之外定义它们的原因。
一旦我这样做,我可以在我的init()中初始化它们?如果我想在另一个类中使用相同的对象,比如C类,该怎么办?我是否必须再次在C.cpp中重新定义它们?
是的,您可以在不初始化的情况下定义它们(它们将使用默认值创建),然后您可以使用init()
方法分配正确的值。
MyObject * currentObject; //在全球范围内 //然后在init中分配
A :: object1 = new MyObject();
不,你只需定义一次。在任何其他类/方法中,您将能够使用A::object1
等引用相同的变量。
答案 1 :(得分:-1)
静态成员需要在全局范围内定义(它们是静态全局变量),如下所示:
class A {
public:
static int i; // declaration, not definition.
};
int A::i; // definition (initialization here is not mandatory, but be careful...)
int main(...) {
A::i = 0; // complex initialization can be performed here...
...
}
静态成员的初始化有时可能非常棘手,尤其是当两者之间存在依赖关系时。