Указание свойства класса другому классу с помощью векторов - PullRequest
0 голосов
/ 20 мая 2010

У меня есть простой класс и другой класс, у которого есть свойство, указывающее на первый класс:

#include <iostream>
#include <vector>

using namespace std;

class first{
public:
    int var1;
};

class second{
public:
    first* classvar;
};

Тогда у меня есть пустота, которая должна указывать "classvar" на предполагаемую итерацию класса "first".

void fill(vector<second>& sec, vector<first>& fir){
    sec[0].classvar = &fir[0];
}

Наконец, основной (). Создайте и заполните вектор класса «first», создайте «second» вектор и запустите функцию заполнения.

int main(){

    vector<first> a(1);
    a[0].var1 = 1000;

    vector<second> b(1);

    fill(b, a);

    cout << b[0].classvar.var1 << '\n';

    system("PAUSE");
    return 0;
}

Это дает мне следующую ошибку:

1>c:\...\main.cpp(29) : error C2228: left of '.var1' must have class/struct/union
1>        type is 'first *'

И я не могу понять, почему он читает "classvar" как целый вектор, а не только один экземпляр. Должен ли я сделать это

cout << b[0].classvar[0].var1 << '\n';

отлично читается.

Может кто-нибудь выяснить проблему? Заранее спасибо

Ответы [ 4 ]

0 голосов
/ 20 мая 2010

Это

cout << b[0].classvar.var1 << '\n';

должно быть

cout << b[0].classvar->var1 << '\n';

, поскольку classvar второго является указателем на первый.

Это

b[0].classvar[0].var1

работает из-за эквивалентности указателей и массивов в C & C ++.

0 голосов
/ 20 мая 2010

Проблема в том, что b[0].classvar является указателем. Чтобы получить доступ к членам класса через указатель, вы должны использовать оператор ->, а не ..

Причина, по которой b[0].classvar[0].var1 работает, заключается в том, что оператор индекса [] для указателей делает этот эквивалент (*(b[0].classvar + 0)).var1. Другими словами, он добавляет 0 к указателю и затем разыменовывает его, поэтому вы можете получить к нему доступ с помощью оператора точки.

0 голосов
/ 20 мая 2010
b[0].classvar->var1
0 голосов
/ 20 мая 2010
cout << b[0].classvar->var1 << '\n';

b[0].classvar - указатель. Ваш текущий код должен быть действительным с этим исправлением, но убедитесь, что вы не сделаете указатель недействительным позже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...