Как получить доступ к объекту внешнего класса из внутреннего класса в C ++ - PullRequest
1 голос
/ 28 января 2012

Я пытаюсь получить доступ к переменной внешнего класса cell[i][j] из метода внутреннего класса iterateForward.

Я не хочу передавать this внешнего класса в iterateForward как iterateForward(Matrix&), поскольку он добавит параметр к iterateForward.

Внутренний метод класса:

Pos Matrix::DynamicCellIterator::iterateForward(){
                    ....................
         (Example)    outerRef.cell[i][j].isDynamic = true;          
                    .....................
                    }

Вот мой класс:

 class Matrix { 
       class DynamicCellIterator{
            Cell* currentCellPtr;
            Matrix& outerRef;  //This will be the key by which i'll get access of outer class variables
        public:
            DynamicCellIterator(Matrix&);
                Pos iterateForward();
        };
        Cell cell[9][9];
        DynamicCellIterator dynIte(*this); // I have a problem of initializing the outerRef variable.
        Error errmsg;
        bool  consistent;


    public:
        Matrix();
        Matrix(Matrix&);
            ................
    }


//Here I tried to initialize the outerRef.
    Matrix::DynamicCellIterator::DynamicCellIterator(Matrix& ref){
        this->currentCellPtr = NULL;
        this->outerRef = ref;
    }

Как я могу инициализировать outerRef

Ответы [ 2 ]

4 голосов
/ 28 января 2012

Вам нужно инициализировать ссылки на элементы в списке инициализации конструктора. И сделайте то же самое для члена dynIte: инициализируйте его в конструкторе external.

Примерно так:

class Outer {
    class Inner {
        int stuff;
        Outer &outer;

        public:
            Inner(Outer &o): outer(o) {
                // Warning: outer is not fully constructed yet
                //          don't use it in here
                std::cout << "Inner: " << this << std::endl;
            };
    };

    int things;
    Inner inner;

    public:
        Outer(): inner(*this) {
                std::cout << "Outer: " << this << std::endl;
        }
};
3 голосов
/ 28 января 2012

Пусть конструктор внутреннего класса примет указатель на объект внешнего класса и сохранит его в элементе данных для последующего использования. (Это, по сути, то, что Java делает автоматически под капотом, кстати.)

...