【问题标题】:Pass an object by reference to a method通过引用方法传递对象
【发布时间】:2012-05-20 22:46:57
【问题描述】:

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

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

架构 x86_64 的未定义符号:“prueba::num”,已引用 从: _main 在 ccbRZYqe.o ccbRZYqe.o 中的metodoC(prueba*) prueba::prueba() 在 ccbRZYqe.o ccbRZYqe.o "prueba::flag" 中的 prueba::inicio(),引用自: ccbRZYqe.o 中的metodoC(prueba*) prueba::prueba() 在 ccbRZYqe.o ccbRZYqe.o ld 中的 prueba::inicio():未找到架构 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;
}

【问题讨论】:

    标签: c++ object reference


    【解决方案1】:

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

    class prueba {
      // as before
    };
    

    实现文件中:

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

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

    但请注意,每次实例化新的 prueba 对象时,都会重置构造函数中的静态成员。

    【讨论】:

    • 感谢您的明确答复。 / Gracias por tu respuesta.
    • @JorgeVegaSánchez de nada。我添加了一个关于重复符号的句子,如果您有多个使用 prueba 类的翻译单元,这可能很重要。
    【解决方案2】:

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

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

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

    【讨论】:

    • 这两种都是访问会员的完全有效的方式。
    • @CD1212 这不是必需的,但可以提高成员不属于任何特定实例的可理解性。问题是静态成员需要在翻译单元中定义。
    【解决方案3】:

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

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

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

    它对你来说很好用

    【讨论】:

    • 实际上,它们需要在类内部声明(原样)并在外部定义
    猜你喜欢
    • 2011-05-11
    • 1970-01-01
    • 2017-09-11
    • 2011-07-06
    • 2012-07-07
    • 2012-01-05
    • 2012-07-16
    • 2011-12-12
    相关资源
    最近更新 更多