2d数组作为默认构造函数参数c ++

时间:2015-12-29 18:27:56

标签: c++ constructor

我无法在任何地方找到答案。

我写了这堂课:

class Message {
private:
    char senderName[32];

    char* namesOfRecipients[];

    int numOfContacts;

    char subject[129];

    char body[10001]; 
};

我试图用这样的默认参数编写构造函数:

Message(char senderName[32]="EVA",
        char* Recipents[]={"glados","edi"},
        int numOfRec=3,
        char subject[129]="None",
        char content[10001]="None");

但是,无论我怎么写,它都不会接受收件人默认参数。

甚至可以将2D数组作为构造函数的默认参数传递吗?

4 个答案:

答案 0 :(得分:3)

Sooo很多指针和数组......如果它是C ++为什么要这么麻烦?只需写下:

class Message {
private:
    std::string senderName;

    std::vector<std::string> namesOfRecipients;

    int numOfContacts;

    std::string subject;

    std::string body; 
};

Message("EVA", {"glados","edi"}, 3, "None", "None");

有人很高兴......

答案 1 :(得分:0)

正如保罗所说,你应该将namesOfRecipients的声明改为

 char **namesOfRecipients;

然后,您可以在类中拥有一个私有的const静态数组,并使用指向其第一个元素的指针初始化namesOfRecipients。代码如下。

编辑:了解数据语义在这里很重要,例如与Jarod的解决方案相比。默认ctor将常量指针数组的地址存储到常量字符串。完全不可能将不同的字符复制到名称中,或者让数组中的某个指针指向新名称,或者附加名称。这里唯一合法的事情是用指向char的新指针数组的指针替换namesOfRecipients的值。

class Message {
private:
    char senderName[32];

    char** namesOfRecipients;

    int numOfContacts;

    char subject[129];

    char body[10001]; 
    static const char* defaultNames[];
    public:
    Message(const char senderName[32]="EVA",
        const char** Recipents = defaultNames,
        int numOfRec=3,
        const char subject[129]="None",
        const char content[10001]="None");
};

const char *Message::defaultNames[] = {"Jim", "Joe"};

答案 2 :(得分:-1)

您可以执行以下操作:

namespace
{

    char (&defaultSenderName())[32]
    {
        static char s[32] = "EVA";
        return s;
    }

    const char* (&defaultNamesOfRecipients())[2]
    {
        static const char* namesOfRecipients[2]={"glados", "edi"};
        return namesOfRecipients;
    }

}

class Message {
private:
    char senderName[32];
    const char* namesOfRecipients[2];

public:
    Message(char (&senderName)[32] = defaultSenderName(),
            const char* (&namesOfRecipients)[2] = defaultNamesOfRecipients())
    {
        std::copy(std::begin(senderName), std::end(senderName), std::begin(this->senderName));
        std::copy(std::begin(namesOfRecipients), std::end(namesOfRecipients), std::begin(this->namesOfRecipients));
    }
};

但使用std::string / std::vector会更简单。

答案 3 :(得分:-1)

使用单独的指针数组(它不是2-D数组,尽管它可能看起来像它)作为默认参数:

char* defaultRecipents[] = {"glados","edi"};

class Message {
public:
    Message(char senderName[32]="EVA",
            char* Recipents[]=defaultRecipents){}
};

指定默认数组&#34; inline&#34;不起作用,因为编译器&#34;认为&#34;关于它std::initializer_list,仅适用于initialization,不适用于声明。对不起,如果这听起来很模糊;我对这件事没有足够的经验。

注意:您可能希望使用const声明您的字符串,以使编译器(以及您未来的自己)清楚该类是否会改变字符串:

const char* const defaultRecipents[] = {"glados","edi"};

class Message {
public:
    Message(char senderName[32]="EVA",
            const char* const Recipents[]=defaultRecipents){}
};

这里它说const两次声明它不会:{/ p>

  1. 更改数组元素(例如,用另一个字符串或nullptr替换一个数组元素,这是一个字符串);和
  2. 更改字符串的内容(例如,在中间剪切字符串或编辑它)