【问题标题】:First Dimension Unsized Class Member第一维无大小类成员
【发布时间】:2014-03-20 16:09:35
【问题描述】:

我有一个要转换的课程:

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

【问题讨论】:

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


    【解决方案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];
    };
    

    【讨论】:

    • 您输入正确!但是您的初始化不起作用。我正在努力在 ctor 主体中创建一个初始化,但我认为我没有正确理解这会创建什么类型。
    • nullptr 是 C++11,你可以使用 NULL 代替。
    • 我已经将我的测试代码转储到问题中,您可以看到局部变量的初始化方式不同。
    • @JonathanMee:我添加了样本来初始化bar(根据需要)。
    • 看来,除了用定义的大小声明变量之外,我唯一的初始化方法是静态变量:(我想进一步澄清一下,const char* (*bar)[3] 没有定义大小为 3 的数组char**s 就像我想的那样,但它定义了什么?
    猜你喜欢
    • 2011-04-23
    • 2013-10-22
    • 1970-01-01
    • 2016-01-03
    • 2016-12-20
    • 2018-08-10
    • 2014-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多