我无法在任何地方找到答案。
我写了这堂课:
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数组作为构造函数的默认参数传递吗?
答案 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>
nullptr
替换一个数组元素,这是一个字符串);和