Я пишу класс C ++ для чтения входных данных из файла в заранее выделенные буферы, называемые "чанками".
Я хочу, чтобы вызывающая сторона могла вызывать публичный статический метод класса Chunk с именем GetNextFilledChunk () , который
- Захватывает чанк из неактивного пула чанков
- Заполняет экземпляр Chunk из входного потока, используя переменные / функции закрытого члена Chunk
- Возвращает указатель на чанк для вызывающей стороны
Но шаг 2 дает мне приступы. Независимо от того, что я пробовал, попытка получить доступ к частным переменным / функциям экземпляра Chunk приводит к тому, что g ++ 4.2.1 выдает ошибки.
Вот фрагмент определения класса из заголовочного файла:
class Chunk
{
public:
Chunk();
...
static Chunk* GetNextFilledChunk();
...
private:
...
ssize_t m_ActualTextSize;
};
И вот часть исходного файла, которая показывает проблему:
#include "Chunk.h"
Chunk::
Chunk* GetNextFilledChunk()
{
...
theChunk = sInactiveChunks.top();
sInactiveChunks.pop();
...
theChunk->m_ActualTextSize = TextSize(); // PROBLEM IS HERE
...
return theChunk;
}
Как показано, g ++ жалуется, что GetNextFilledChunk () пытается получить доступ к закрытому члену Chunk.
Тогда я подумал, может быть, это должен быть «друг». Но все, что я пытался сделать в заголовочном файле, чтобы сделать GetNextFilledChunk () другом, приводит к ошибке. Например:
друг статический Chunk * GetNextFilledChunk ();
приводит к «Chunk.h: 23: предупреждение:« Chunk * GetNextFilledChunk () »объявлен« статическим », но никогда не определен»
Что я нахожу действительно странным, так это то, что если я просто сделаю GetNextFilledChunk () простой старой функцией, а не статической функцией-членом, я могу «подружиться» с ней, и все будут счастливы. Но это кажется глупым - почему нужно делать что-то в классе из функции, не относящейся к классу, что нельзя сделать из статической функции-члена?
Итак ... Как функция Chunk GetNextFilledChunk () может получить доступ к закрытым переменным-членам экземпляра Chunk?
А если это невозможно, это неотъемлемая часть C ++ или просто ошибка в g ++?