通过引用方法传递对象

时间:2012-05-12 19:06:50

标签: c++ object reference

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

程序无法编译,编译器会抛出非常奇怪的错误消息。

  

架构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;
}

3 个答案:

答案 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;