First Dimension Unsized Class Member

时间:2014-03-20 16:09:36

标签: c++ multidimensional-array static dynamic-arrays member-variables

我有一堂课正在转换:

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();
}

1 个答案:

答案 0 :(得分: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;
};

或:

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];
};