我认为我犯的错误是如此愚蠢,但我不知道我做错了什么。 我有一个静态和非静态变量类和一些方法,都是公开的。 在我的程序中,我想创建一个对象,并通过引用将该对象传递给一般方法。
程序无法编译,编译器会抛出非常奇怪的错误消息。
架构x86_64的未定义符号:“prueba :: num”,引用 从: _main在ccbRZYqe.o中 ccbRZYqe.o中的metodoC(prueba *) ccbRZYqe.o中的prueba :: prueba() ccbRZYqe.o“prueba :: flag”中的prueba :: inicio(),引自: ccbRZYqe.o中的metodoC(prueba *) ccbRZYqe.o中的prueba :: prueba() ccbRZYqe.o中的prueba :: inicio()ld:找不到架构x86_64的符号collect2:ld返回1退出状态
代码
#include <iostream>
using namespace std;
class prueba
{
private:
public:
static bool flag;
static int num;
float complejo;
// Metodos
//--------------
prueba()
{
flag = false;
num = 0;
complejo = 0.0;
}
void inicio()
{
flag = true;
num = 5;
complejo = 3.2;
}
bool cambio()
{
flag++;
num++;
complejo++;
}
};
bool metodoC(prueba* ensayo)
{
cout << "-----------------------------------------" << endl;
cout << "- flag: " << ensayo->flag << endl;
cout << "- num: " << ensayo->num << endl;
cout << "- Complejo: " << ensayo->complejo << endl;
cout << "-----------------------------------------" << endl;
return true;
}
//-----------------------------------
// M A I N
//-----------------------------------
int main(int argc, char *argv[])
{
prueba test;
test.inicio();
test.num += 2;
test.complejo += 5.2;
metodoC( &test );
return 0;
}
答案 0 :(得分:5)
您需要定义静态成员。它们只是宣布。
class prueba {
// as before
};
并在实施文件中:
bool prueba::flag=false;
int prueba::num=0;
请注意,您不应将定义放在标题中,因为您将获得每个翻译单元的静态定义。您需要将它们放在一个实现文件中,然后用于生成客户端可以构建的单个目标文件。
但请注意,每次实例化一个新的prueba
对象时,都会重置构造函数中的静态成员。
答案 1 :(得分:1)
类中的静态成员应该在类中声明,但在类
之外定义 `bool prueba::flag=false;`
int prueba::num=0;`
在课后添加这些,并从构造函数中删除它们的定义。
它可以正常使用
答案 2 :(得分:0)
我认为错误是因为prueba中的num值被声明为static,因此通过以下方式访问它:test.num将不起作用,这就是未定义值的原因。
如果你改为prueba :: num + = 2;它应该工作正常,也添加适当的初始化器:
bool prueba::flag = false;
int prueba::num = 0;