无法引用非静态字段“x”

时间:2012-01-16 06:57:00

标签: c++ linux debugging gdb

anisha@linux-dopx:~/> gdb a.out
(gdb) watch dummyA::x
Cannot reference non-static field "x"
(gdb) 

x是名为 dummyA 的类的私有成员 如何在班级的私人成员上设置观察点?

语言:C ++
平台:Linux

编辑1:

#include <iostream>
using namespace std;

class dummyA
{
    int x;

    public:
        dummyA ()
        {
            x = 0;
        }

        void test ()
        {
            x++;
        }
};

int main ()
{
    dummyA obj;
    obj.test ();
    obj.test ();
    obj.test ();
}

输出:

(gdb) watch obj.x
No symbol "obj" in current context.

(gdb) watch obj::x
No symbol "obj" in current context.

现在,这个错误意味着什么?

3 个答案:

答案 0 :(得分:3)

假设你有这个:

class A {
 private:
   int x;
}

int main()
{
    A foo;
    A bar;
    return 0;
}

现在您有两个名为Afoo的{​​{1}}个实例。如果您告诉调试器注意bar它是如何知道您的意思是什么?

当您观察实例变量(每个实例有一个)而不是静态变量(每个类只有一个)时,您需要指定要监视的实例变量。您正在指定要观看的类变量。虽然使用静态变量(每个类只有一个静态变量)就可以了,但实例变量并不合适。

在这种情况下,在A::x中,在单步执行mainA foo;后,您可以执行以下操作:

A bar;

watch foo.x

它会工作得很好。你必须超越这些行,因为在它们之后,甚至不存在名称(更不用说它们所引用的对象)。

答案 1 :(得分:1)

GDB似乎认为这是一个非静态成员,因此您需要一个实例化对象来获取它。

确定您已将此类成员标记为static吗?如果您希望通过类访问它,它必须是静态的(特定于类而不是特定于对象)。

使用以下程序:

#include <iostream>
class xyzzy { public: int x; };
//int xyzzy::x = 7;
int main (void) {
    xyzzy plugh;
    plugh.x = 42;
    std::cout << plugh.x << '\n';
    return 0;
}

我的会话与你的会话类似:

(gdb) b main
Breakpoint 1 at 0x80485cd: file qq.cpp, line 12.
(gdb) run
Starting program: /home/pax/qq 
Breakpoint 1, main () at qq.cpp:12
12      plugh.x = 42;
(gdb) watch xyzzy::x
Cannot reference non-static field "x"
(gdb) 

但是,当我x静态并取消注释初始化时,我会更成功:

(gdb) b main
Breakpoint 1 at 0x80485cd: file qq.cpp, line 6.
(gdb) run
Starting program: /home/pax/qq 
Breakpoint 1, main () at qq.cpp:6
6       plugh.x = 42;
(gdb) watch xyzzy::x
Hardware watchpoint 2: xyzzy::x

如果你想观看一个对象(而不是类)的成员,你必须等到它被证实,例如:

#include <iostream>
class xyzzy { public: int x; };
int main (void) {
    xyzzy plugh;
    plugh.x = 42;
    std::cout << plugh.x << '\n';
    return 0;
}

和成绩单:

(gdb) b main
Breakpoint 1 at 0x80485cd: file qq.cpp, line 5.
(gdb) run
Starting program: /home/pax/qq 

Breakpoint 1, main () at qq.cpp:5
5       plugh.x = 42;
(gdb) watch plugh.x
Hardware watchpoint 2: plugh.x
(gdb) 

答案 2 :(得分:0)

由于x是您的类的私有成员,因此它的信息(以及它的内存位置)取决于您访问它的对象(this指针)。

因此,您需要将手表设置在有关对象的范围可访问引用的位置(如果您使用成员方法,则包括this指针)。

另一个解决方案可能是使用访问器和mutators,并通过这些访问器专门访问您的变量。然后你就可以在存取器和放大器中放置一个标准断点。 mutators,它允许您打破对私有ivar x的任何访问,而无需特定于对象的信息。

相关问题