Как получить доступ к закрытым переменным-членам в динамическом массиве объектов? - PullRequest
0 голосов
/ 09 сентября 2018

У меня есть два класса.Класс WorldList содержит указатель на динамический массив объектов WordOccurence:

class WordOccurrence {
public:
{...member functions...}
private:
    string word_;
    int num_;
};

class WordList{
public:
WordList(WordList&);
{...member functions...}
private:
    WordOccurrence *wordArray_; 

    int size_;
};

Вот моя проблема: я получаю ошибку в своем конструкторе копирования при попытке доступа к переменным WordOccurence,Мой конструктор копирования выглядит следующим образом:

WordList::WordList(WordList &rhs){
    size_ = rhs.size_;
    wordArray_ = new WordOccurrence[rhs.size_];
    for(int i = 0; i < rhs.size_; ++i){
        wordArray_[i]->word_ = rhs.wordArray_[i]->getWord();
        wordArray_[i]->num_ = rhs.wordArray_[i]->getNum();
    }
}

Я получаю сообщения об ошибках:

ошибка: тип ссылки на член 'WordOccurrence' не является указателем;Вы хотели использовать «.»?

ошибка: «word_» является частным членом «WordOccurrence»

и повторяется для num_ variable.

Может кто-нибудь пролить свет на то, чего мне здесь не хватает?Я подумал, что можно получить доступ к закрытым переменным-членам через указатель на этот конкретный объект, разве это не идея оператора стрелки?

1 Ответ

0 голосов
/ 09 сентября 2018

Ваш wordArray_ определяется как указатель на WordOccurrence:

    WordOccurrence *wordArray_

Таким образом, тип wordArray_[i] относится к WordOccurrence объекту. А для доступа к членам объекта вы должны использовать ., а не ->.

Проблема, с которой вы все еще сталкиваетесь, заключается в том, что вы пытаетесь установить непосредственно участников новых вхождений:

    wordArray_[i].word_ = rhs.wordArray_[i].getWord();
    wordArray_[i].num_ = rhs.wordArray_[i].getNum();

Теперь getWord() и getNum() являются общедоступными, но word_ и num_ являются частными для WordOccurence и поэтому невидимы для WordList.

Самый простой способ сделать Wordlist другом WordOccurence:

class WordOccurence {
    ...
    friend class WordList; 
};

Гораздо более понятный способ - использовать конструктор копирования WordOccurences:

WordList::WordList(WordList &rhs){
    size_ = rhs.size_;
    wordArray_ = new WordOccurrence[rhs.size_];
    for(int i = 0; i < rhs.size_; ++i){
        wordArray_[i] = rhs.wordArray_[i]; 
    }
}

Теперь еще лучшим способом было бы определить wordArray_ как vector<WordOccurence> вместо массива: вам больше не нужно было бы беспокоиться о его копии.

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