доступ к члену класса массива указателей другого класса

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

Что я могу сделать, так это: у меня есть класс с членом. Я создаю массив указателей этого класса и создаю из него НОВЫЕ части (через цикл), и все в порядке. Я также могу создать другой класс с аналогичным массивом и даже создать его НОВЫЕ экземпляры и инициализировать их, но когда я пытаюсь получить к ним доступ, у меня возникают проблемы.

Этот код почти работает нормально:

#include <iostream>
using namespace std;

class testClass{
    public:
    int number;
};

class testPoint{
    public:
    testClass testInstance;
    testClass *testclassArray[5];
    void makeArray();
    void setToI();
};

void testPoint::makeArray(){
    for (int i = 0; i < 5; i++){
        testclassArray[i] = new testClass;
    }
}

void testPoint::setToI(){
    for (int i = 0; i < 5; i++){
        (*testclassArray[i]).number = i;
    }
}

int main(void){
    testPoint firstTestPoint;
    firstTestPoint.makeArray();
    firstTestPoint.setToI();
//  EXCEPT FOR THIS LINE this is where I have problems
    cout << firstTestPoint.(*testclassArray[0]).number << endl;
    return 0;
}

Я знаю, что это должно работать, потому что это работает

int main(void){
    testPoint firstInstance;
    firstInstance.testInstance.number = 3;
    cout << firstInstance.testInstance.number << endl;
    // and this works
    return 0;
}

и это работает

int main(void){
    testClass *testPointer[5];
    for (int i = 0; i < 5; i++){
        testPointer[i] = new testClass;
        (*testPointer[i]).number = i; 
    }
    cout << (*testPointer[0]).number << endl; 
    return 0; 
}

так почему я не могу получить доступ к членам функции cout таким же образом?


person Alexander Kleinhans    schedule 24.09.2014    source источник


Ответы (3)


Ниже приведен недопустимый синтаксис:

cout << firstTestPoint.(*testclassArray[0]).number << endl;

Наиболее распространенный способ написать то, что вы пытаетесь выполнить, это:

cout << firstTestPoint.testclassArray[0]->number << endl;

Но, если хотите, вы также можете написать:

cout << (*firstTestPoint.testclassArray[0]).number << endl;

(Второй способ намного менее распространен.)

Оператор . используется для доступа к членам прямых объектов, например. a.member, где a может быть объявлено как struct A a;. Оператор -> используется для доступа к членам косвенных объектов (также называемых указателями на объекты), например. b->member, где b может быть объявлено как struct B* b = new B();.

person inspector-g    schedule 24.09.2014

Вы неправильно разыменовываете переменную. Попробуйте сделать

cout << firstTestPoint.testclassArray[0]->number << endl;

вместо. Точно так же можно было бы написать и вторую попытку, где она у вас работает:

out << testPointer[0]->number << endl;
person fredrik    schedule 24.09.2014

Попробуйте использовать этот код:

cout << firstTestPoint.testclassArray[0]->number << endl;
person featherless biped    schedule 24.09.2014