Неразмерный член класса первого измерения

У меня есть класс, который я конвертирую:

class MyClass
{
public::
    void foo( void )
    {
        static const char* bar[][3] = { NULL };
        func( bar );
    }
};

Теперь я хочу сделать bar переменной-членом, но, поскольку первое измерение не имеет размера, я не могу. Я также не могу передать const char** bar[3] void func( const char* param[][3] ). Есть ли обходной путь, о котором я не знаю, или это ситуация, когда я должен использовать метод static?

Редактировать в ответ на Jarod42

Сопоставление инициализации bar - моя проблема здесь. Я думаю, что я должен, по крайней мере, сделать это в теле ctor, если не в списке инициализации ctor. Вот некоторый тестовый код:

static const char* global[][3] = { NULL };

void isLocal( const char* test[][3] )
{
    // This method outputs" cool\ncool\nuncool\n
    if( test == NULL )
    {
        cout << "uncool" << endl;
    }
    else if( *test[0] == NULL )
    {
        cout << "cool" << endl;
    }
}

class parent
{
public:
    virtual void foo( void ) = 0;
};

parent* babyMaker( void )
{
    class child : public parent
    {
    public:
        virtual void foo( void )
        {
            static const char* local[][3] = { NULL };

            isLocal( local );
            isLocal( global );
            isLocal( national );
        }
        child():national( nullptr ){}
    private:
        const char* (*national)[3];
    };
    return new child;
}

int main( void )
{
    parent* first = babyMaker();
    first->foo();
}

person Jonathan Mee    schedule 20.03.2014    source источник


Ответы (1)


const char* bar[][3] – это не const char** bar[3], а const char* (*bar)[3].
Вам может понадобиться что-то вроде:

class MyClass
{
public:
    MyClass() : bar(nullptr) {}

    void foo() { func(bar); }
private:
    const char* (*bar)[3];
};

Я предлагаю использовать typedef как:

class MyClass
{
public:
    typedef const char* bar_t[3];
public:
    MyClass() : bar(new bar_t[2]) {
        for (int j = 0; j != 2; ++j) {
            for (int i = 0; i != 3; ++i) {
                bar[j][i] = nullptr;
            }
        }
    }
    ~MyClass() { delete [] bar; }

    void foo() { func(bar); }

private:
    MyClass(const MyClass&); // rule of three
    MyClass& operator =(const MyClass&); // rule of three
private:
    bar_t* bar;
};

or:

class MyClass
{
public:
    typedef const char* bar_t[3];
public:
    MyClass() { for (int i = 0; i != 3; ++i) { bar[0][i] = nullptr; } }

    void foo() { func(bar); }

private:
    bar_t bar[1];
};
person Jarod42    schedule 20.03.2014
comment
Вы правы в типировании! однако ваша инициализация не работает. Я работал над созданием инициализации в теле ctor, но я не думаю, что правильно понимаю, какой тип это создает. - person Jonathan Mee; 20.03.2014
comment
nullptr — это C++11, вместо него вы можете использовать NULL. - person Jarod42; 21.03.2014
comment
Я добавил свой тестовый код в вопрос, и вы можете видеть, что локальная переменная инициализируется по-другому. - person Jonathan Mee; 21.03.2014
comment
@JonathanMee: я добавил образец для инициализации bar (как и хотел). - person Jarod42; 21.03.2014
comment
Похоже, что помимо объявления переменной с определенным размером, мой единственный ресурс для инициализации - это статическая переменная :( Я хотел бы еще одно уточнение, const char* (*bar)[3] не определяет массив char** размера 3, как я думал, но что он делает определять? - person Jonathan Mee; 21.03.2014
comment
bar является указателем массива (размера 3) из const char*. В C++11 это понятнее: std::array<const char*, 3>* bar; - person Jarod42; 22.03.2014
comment
Есть ли способ, которым я могу преобразовать std::array< const char*, 3 >* bar в параметр const char* param[][3] func? Или, может быть, наоборот, где параметр имеет тип std::array< const char*, 3 >*, а я привожу к нему тип const char* bar[][3]? - person Jonathan Mee; 25.03.2014
comment
@JonathanMee: вы можете преобразовать std::array< const char*, 3 > в const char* (*bar)[3] (см. ideone.com/VLvGrF)... Не уверен, что это так. чистый способ сделать ... - person Jarod42; 26.03.2014
comment
Yikes reinterpret_cast, я знаю, что мы полностью вышли за рамки первоначального вопроса, поэтому я создам новый вопрос и размещу ссылку здесь. Спасибо за ваше время. Я думаю, поскольку исходная переменная-член была статической, мне нужно создать статическую переменную в области действия функции, но я все еще хочу получить ответ на вопрос о приведении. - person Jonathan Mee; 26.03.2014
comment
Разговор продолжается: stackoverflow.com/questions/22671635/ - person Jonathan Mee; 28.03.2014