C++: синтаксис для доступа к членской структуре от указателя до класса

Если Xcode недавно обновился, вам, возможно, придется согласиться с новыми условиями лицензии. Если вы не согласны с условиями лицензии, FileMerge (при запуске из SourceTree) немедленно прекратит работу.

Чтобы проверить это, откройте оболочку и запустите от имени обычного пользователя:

$ opendiff

Если проблема в лицензии, она сообщит вам. Чтобы согласиться с новыми условиями лицензии, вам нужно запустить open diff, используя sudo:

$ sudo opendiff

После принятия условий лицензии вы можете повторить попытку запуска FileMerge из SourceTree с помощью Resolve Conflicts > Launch External Merge Tool. FileMerge должен запускаться и вести себя нормально.

8
задан Peter Ølsted 27 May 2009 в 10:53
поделиться

5 ответов

Здесь вы определяете только структуру, но не выделяете ее. Попробуйте следующее:

class Foo{
public:
    struct Bar{
        int otherdata;
    } mybar;
    int somedata;
};

int main(){
    Foo foo;
    foo.mybar.otherdata = 5;

    cout << foo.mybar.otherdata;

    return 0;
}

Если вы хотите повторно использовать структуру в других классах, вы также можете определить структуру снаружи:

struct Bar {
  int otherdata;
};

class Foo {
public:
    Bar mybar;
    int somedata;
}
15
ответ дан 5 December 2019 в 05:46
поделиться

Бар - это внутренняя структура, определенная внутри Foo . Создание объекта Foo неявно не создает членов Bar . Вам необходимо явно создать объект Bar, используя синтаксис Foo :: Bar .

Foo foo;
Foo::Bar fooBar;
fooBar.otherdata = 5;
cout << fooBar.otherdata;

В противном случае

Создайте экземпляр Bar как член в классе Foo .

class Foo{
public:
    struct Bar{
        int otherdata;
    };
    int somedata;
    Bar myBar;  //Now, Foo has Bar's instance as member

};

 Foo foo;
 foo.myBar.otherdata = 5;
8
ответ дан 5 December 2019 в 05:46
поделиться

Вы создаете вложенную структуру, но никогда не создаете ее экземпляров внутри класса. Вам нужно сказать что-то вроде:

class Foo{
public:
    struct Bar{
        int otherdata;
    };
    Bar bar;
    int somedata;
};

Затем вы можете сказать:

foo.bar.otherdata = 5;
5
ответ дан 5 December 2019 в 05:46
поделиться

Вы объявляете только Foo :: Bar но вы не создаете его экземпляр (не уверен, что это правильная терминология)

См. использование здесь:

#include <iostream>

using namespace std;

class Foo
{
    public:
    struct Bar
    {
        int otherdata;
    };
    Bar bar;
    int somedata;
};

int main(){
    Foo::Bar bar;
    bar.otherdata = 6;
    cout << bar.otherdata << endl;

    Foo foo;
    //foo.Bar.otherdata = 5;
    foo.bar.otherdata = 5;

    //cout << foo.Bar.otherdata;
    cout << foo.bar.otherdata << endl;

    return 0;
}
1
ответ дан 5 December 2019 в 05:46
поделиться
struct Bar{
        int otherdata;
    };

Здесь вы только что определили структуру, но не создали ни одного объекта Это. Следовательно, когда вы говорите foo.Bar.otherdata = 5; , это ошибка компилятора. Создайте объект структуры Bar, например Bar m_bar; , а затем используйте Foo.m_bar.otherdata = 5;

0
ответ дан 5 December 2019 в 05:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: