2012-05-12 53 views
1

我认为我做错了这个错误是如此愚蠢,但我不知道我做错了什么。 我有一个类与静态和非静态变量和一些方法,所有公共。 在我的程序中,我想创建一个对象,并通过引用将此对象传递给一个通用方法。通过引用的方法传递一个对象

该程序不编译,编译器会抛出真正奇怪的错误消息。对于架构x86_64的

未定义的符号: “prueba :: NUM”,从引用 : _main中ccbRZYqe.o在ccbRZYqe.o prueba :: prueba()在ccbRZYqe.o metodoC(prueba *) prueba :: INICIO()在ccbRZYqe.o “prueba ::标志”,从引用:在ccbRZYqe.o metodoC(prueba *)prueba :: prueba()在ccbRZYqe.o prueba :: INICIO()在ccbRZYqe.o 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; 
} 

回答

5

您需要定义静态成员。他们只是宣布。

class prueba { 
    // as before 
}; 

,并在实现文件

bool prueba::flag=false; 
int prueba::num=0; 

注意,你不应该把定义在一个头,因为你会得到静力学每个翻译单元的定义。你需要将它们放在一个实现文件中,然后用它来创建客户端可以构建的单个对象文件。

但要小心,每次实例化一个新的prueba对象时,都会在构造函数中重置静态成员。

+0

谢谢你的明确答案。/Gracias por tu respuesta。 –

+0

@JorgeVegaSánchezde nada。我添加了一个关于重复符号的句子,如果您有多个使用“prueba”类的翻译单元,这可能很重要。 – juanchopanza

0

我认为这个错误是因为prueba中的num值被声明为静态的,因此通过test.num来访问它将不起作用,这就是为什么该值是未定义的。

如果将其更改为prueba :: num + = 2;它应该工作正常,还可以添加在适当的初始化:

bool prueba::flag = false; 
int prueba::num = 0; 
+0

这两种都是访问成员的完美有效方式。 – chris

+0

@ CD1212这不是必需的,但提高了可理解性,即成员不属于任何特定实例。问题是需要在翻译单元中定义静态成员。 – Mahesh

1

类的静态成员应在类中声明,但在类外定义

 `bool prueba::flag=false;` 
     int prueba::num=0;` 

下课后添加这些和删除其认定中在构造函数中。

它会正常工作

+1

实际上,他们需要在课堂内部进行声明(因为它们是)和* defined * outside之外。 – juanchopanza