Определение приватного метода, возвращающего значение приватного типа

#ifndef _CL_CELLS_H_
#define _CL_CELLS_H_

// Класс реализует односвязный список клеток - элементов типа char.
class cl_cells {
    public:
// ...      
    private:
        struct cell { char value; cell *next; } *p_head; // начало списка
        cell *get_cell(unsigned long int index); // возвращает ссылку на клетку
};

#endif // _CL_CELLS_H_

В приведенном примере и структура и метод предназначены для использования только в пределах класса. Определение метода я хочу вынести в отдельный файл (cl_cells.cpp), но в нем не виден тип структуры.
Как реализовать определение метода, чтобы было правильно? Определить тип struct cell еще раз в файле cl_cells.cpp? Или есть более красивый способ?

HaabaCoder, а ты пробовал реализовать или сразу решил спросить?

У тебя получается два файла: cl_cells.h и cl_cells.cpp. В первом объявлен класс с объявлением приватной структуры и объявлением приватного метода. Во втором ты планируешь определять метод. Но для этого во втором файле должны быть видны объявления и класса, и метода. Т.е. во второй файл ты должен включить первый файл (#include "cl_cells.h"). Следовательно объявление структуры там будет тоже видно. Так что проблемы нет как таковой.

HaabaCoder, а ты пробовал реализовать или сразу решил спросить?

Cranium, конечно, я сперва написал код и попробовал откомпилировать. Директива #include присутствует.

#include "cl_cells.h"

cl_cells::cl_cells(unsigned long int num) {
    number = num; // сохраняем количество клеток
    p_head = new cell; // создаем первую клетку
    p_head->value = 0;
    p_head->next = 0;
    cell *p_last, *p_curr = p_head;
    for (unsigned long int i=1; i<num; i++) { // если num = 2 или больше
        p_last = new cell; // создаем новую клетку
        p_last->value = 0;
        p_last->next = 0;
        p_curr->next = p_last; // связываем новую клетку с текущей
        p_curr = p_last; // делаем новую клетку текущей
    };
}

cell cl_cells::*get_cell(unsigned long int index) {
}

Компилятор выдает ошибку: 24 1 D:\_2_\cl_cells.cpp [Error] 'cell' does not name a type.
Причем определение конструктора компилируется вообще без вопросов (если закомментить get_cell), хотя в нем тоже есть обращения к типу cell.

cell надо использовать с квалификатором: именем охватывающего класса.

cl_cells.h

#ifndef _CL_CELLS_H_
#define _CL_CELLS_H_

class cl_cells {
public:
    cl_cells(unsigned long int num);

private:

    struct cell { 
        char value; 
        cell *next; 
        cell();       // конструктор для структуры
    };

    cell *p_head; // начало списка
    cell *get_cell(unsigned long int index);

    int number;
};

#endif // _CL_CELLS_H_

cl_cells.cpp

#include "cl_cells.h"

// конструктор структуры
cl_cells::cell::cell() : value('\0'), next(nullptr) {}

cl_cells::cl_cells(unsigned long int num) {
    number = num; // сохраняем количество клеток
    p_head = new cell; // создаем первую клетку
    /* это сделает конструктор структуры
    p_head->value = 0;   // должно быть '\0'. Неявное приведение более длинного типа к более короткому.
    p_head->next = 0;    // для указателя использовать литерал 0 не рекомендуется!
    */
    cell *p_last, *p_curr = p_head;
    for (unsigned long int i = 1; i<num; i++) { // если num = 2 или больше
        p_last = new cell; // создаем новую клетку
        /* (1) см. комментарий выше; (2) дублирование кода
        p_last->value = 0;
        p_last->next = 0;
        */
        p_curr->next = p_last; // связываем новую клетку с текущей
        p_curr = p_last; // делаем новую клетку текущей
    };
}

cl_cells::cell * cl_cells::get_cell(unsigned long int index) {
    return nullptr;  // это заглушка
}

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.