Не может ссылаться на нестатическое поле "x" - PullRequest
1 голос
/ 16 января 2012
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 ]

3 голосов
/ 16 января 2012

Предположим, у вас есть это:

class A {
 private:
   int x;
}

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

Теперь у вас есть два экземпляра A с именами foo и bar. Если вы скажете отладчику смотреть A::x как он узнает, какой экземпляр вы имеете в виду?

Когда вы смотрите переменную экземпляра (из которых есть одна для каждого экземпляра) вместо статической переменной (из которых только одна для каждого класса), вам нужно указать, какую переменную экземпляра вы хотите просмотреть. Вы указываете, какую переменную класса вы хотите посмотреть. И хотя со статической переменной все в порядке (для каждого класса есть только одна статическая переменная), с переменной экземпляра все в порядке.

В этом случае, в main, пройдя две строки A foo; и A bar;, вы можете сделать:

watch foo.x

или

watch bar.x

и все будет работать нормально. Вы должны пройти мимо этих строк, потому что даже имена (а тем более объекты, на которые они ссылаются) не существуют до тех пор, пока после них не будет.

1 голос
/ 16 января 2012

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) 
0 голосов
/ 16 января 2012

Поскольку x является частным членом вашего класса, его информация (и, следовательно, его местоположение в памяти) зависит от объекта (указатель this), с которым вы обращаетесь к нему.

Таким образом, вам нужно установить часы где-нибудь, у вас есть доступная по области ссылка на соответствующий объект (включая указатель this, если вы нарушите метод-член).

Еще одним решением может быть использование аксессоров и мутаторов, а также доступ к вашей переменной исключительно через эти аксессоры. После этого вы сможете установить стандартную точку останова в аксессорах и мутаторах, что позволит вам установить любой доступ к приватному ivar x без информации, специфичной для объекта.

...