通过引用方法传递对象

Jor*_*hez 1 c++ reference object

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

该程序不编译,编译器抛出非常奇怪的错误消息.

对于建筑x86_64的未定义符号: "prueba :: NUM",从引用:_main在ccbRZYqe.o metodoC(prueba*)在ccbRZYqe.o prueba :: prueba()在ccbRZYqe.o prueba :: INICIO()在ccbRZYqe.o "prueba :: flag",引用自: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;
}
Run Code Online (Sandbox Code Playgroud)

jua*_*nza 5

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

class prueba {
  // as before
};
Run Code Online (Sandbox Code Playgroud)

并在实现文件中:

bool prueba::flag=false;
int prueba::num=0;
Run Code Online (Sandbox Code Playgroud)

请注意,您不应将定义放在标题中,因为您将获得每个翻译单元的静态定义.您需要将它们放在一个实现文件中,然后用于创建客户端可以构建的单个目标文件.

但是要注意,每次实例化一个新prueba对象时,都要重置构造函数中的静态成员.