1

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

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

架构 x86_64 的未定义符号:“prueba::num”,引用自:ccbRZYqe.o 中的 _main ccbRZYqe.o 中的metodoC(prueba*) ccbRZYqe.o 中的prueba::prueba() “prueba::flag”,引用自:ccbRZYqe.o 中的 medoC(prueba*) 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;
}
4

3 回答 3

5

您需要定义静态成员。它们只是被声明的。

class prueba {
  // as before
};

并在实现文件中:

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

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

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

于 2012-05-12T19:10:47.853 回答
1

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

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

在类之后添加这些并从构造函数中删除它们的定义。

它会为你工作得很好

于 2012-05-12T19:16:23.200 回答
0

我认为错误是因为 prueba 中的 num 值被声明为静态,因此通过以下方式访问它: test.num 将不起作用,这就是该值未定义的原因。

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

bool prueba::flag = false;
int prueba::num = 0;
于 2012-05-12T19:13:06.013 回答