C ++: синтаксис для доступа к структуре члена от указателя на класс - PullRequest
8 голосов
/ 27 мая 2009

Я пытаюсь получить доступ к переменным члена структуры, но я не могу понять синтаксис правильно. Две ошибки компиляции пр. Доступ являются: ошибка C2274: «приведение в стиле функции»: недопустимо в правой части «.» оператор ошибка C2228: слева от .otherdata должен быть класс / структура / объединение Я пробовал различные изменения, но ни одно из них не увенчалось успехом.

#include <iostream>

using std::cout;

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

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

    cout << foo.Bar.otherdata;

    return 0;
}

Ответы [ 5 ]

15 голосов
/ 27 мая 2009

Вы определяете там только структуру, а не выделяете ее. Попробуйте это:

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;
}
8 голосов
/ 27 мая 2009

Bar - внутренняя структура, определенная внутри 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;
5 голосов
/ 27 мая 2009

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

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

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

foo.bar.otherdata = 5;
1 голос
/ 27 мая 2009

Вы объявляете только 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;
}
0 голосов
/ 27 мая 2009
struct Bar{
        int otherdata;
    };

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

...