C ++: Как открытая статическая функция-член может получить доступ к закрытым переменным-членам экземпляра? - PullRequest
8 голосов
/ 09 октября 2009

Я пишу класс C ++ для чтения входных данных из файла в заранее выделенные буферы, называемые "чанками".

Я хочу, чтобы вызывающая сторона могла вызывать публичный статический метод класса Chunk с именем GetNextFilledChunk () , который

  1. Захватывает чанк из неактивного пула чанков
  2. Заполняет экземпляр Chunk из входного потока, используя переменные / функции закрытого члена Chunk
  3. Возвращает указатель на чанк для вызывающей стороны

Но шаг 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 ++?

Ответы [ 5 ]

21 голосов
/ 09 октября 2009

Это выглядит немного странно:

Chunk::
Chunk*  GetNextFilledChunk()
{

Это опечатка? Должно ли это быть:

Chunk* Chunk::GetNextFilledChunk()
{

? Похоже, вы случайно определили GetNextFilledChunk как простую функцию, а не как член Chunk.

8 голосов
/ 09 октября 2009

Проблема в вашем определении GetNextFilledChunk. Как написано в файле CPP, вы объявили функцию, не являющуюся членом, которой предшествует неправильно сформированная метка. Он не будет совпадать с функцией-членом в заголовке.

Правильная подпись выглядит следующим образом

Chunk*  
Chunk::GetNextFilledChunk() {
  ...
}
7 голосов
/ 09 октября 2009

Вы неправильно определяете функцию-член. Это должно быть определено так:

Chunk * Chunk::GetNextFilledChunk()
{
    ...
}

То, что определение сработало нормально, было связано с причудой с языком: имена классов вставляются в их собственные пространства имен, поэтому Chunk::Chunk эквивалентно Chunk, поэтому вы определили глобальную функцию случайно.

2 голосов
/ 09 октября 2009

Во-первых, как уже упоминалось, определение функции неверно. Также дружественная функция не требуется, и здесь не имеют значения спецификаторы доступа, так как вы намерены, чтобы функция была частью класса и, очевидно, не воспринималась компилятором так из-за опечаток.

Что касается прямого ответа на ваш вопрос: как открытая статическая функция-член может получить доступ к закрытым переменным-членам экземпляра?

не может; только нестатические функции-члены могут обращаться как к статическим, так и к нестатическим переменным, а статические функции-члены могут обращаться только к статическим переменным-членам. Причина: Не требуется создавать экземпляры объекта для вызова статической функции, и, следовательно, отсутствует указатель this на статическую функцию-член и, следовательно, нет нестатических переменных-членов для доступ.

0 голосов
/ 09 октября 2009

Я думаю, что шаблон синглтона очень хорошо подходит для этого. Вы можете получить доступ к любому виду функций-членов, не беспокоясь, обращаетесь ли вы к ним из статических функций или нет ...

...