好吧,我是C ++的新手,我正在练习构造函数。我正在创建String
类的错误版本,并且我被要求执行下一个任务:
a)创建一个构造函数,您可以在其中进行从const char*
到String
的转换。
b)使用const char*
中的'n'个字母创建一个构造函数。如果“n”长于此const char*
,则此const char*
的副本将写为String
。如果'n == 0',程序将写一个空的String
。
我认为实施它们没有问题;这就是我所拥有的:
Cadena::Cadena(const char* cad){
tam_ = strlen(cad);
s_ = new char[tam_ + 1];
strcpy(s_,cad);
}
Cadena::Cadena(const char* cad, unsigned lon){
tam_ = lon;
s_ = new char[tam_ + 1];
for(unsigned i = 0; i < tam_; i++){
s_[i] = cad[i];
}
s_[tam_] = '\0';
}
当我尝试在我的main方法中测试它们时出现问题,我得到了这个错误:“c1含糊不清”。
我尝试使用虚拟参数进行此操作(将unsigned
参数声明为int
但我的标题中没有名称)但我想将第二个参数初始化为0并且我不能使用虚拟参数进行此操作。
我知道编译器不知道哪个构造函数必须使用,但我想以某种方式这样做。有人能帮助我吗?抱歉我的英语不好。
答案 0 :(得分:2)
我正在创建一个糟糕的String类...
NO NO NO 。这绝不是你应该做的事情。你说你是c ++的初学者,这并不意味着你会编写“坏”代码,也许它是天真的,长的,有错误的语法,并不是最好的解决方案,但这并不会让它“糟糕” 。另外,如果你真的认为你的字符串类“糟糕”,那么我建议你重做它。您正在学习,不要故意编写您知道的代码低于您的标准。现在你的代码如何影响你将来编写“更好”代码的方式,即使你认为它不会。
因此,为了您的利益以及将来使用您的代码的人们,请不要试图逃避“糟糕”的代码。干杯!
答案 1 :(得分:-2)
实际上,您只需要一个构造函数。另外,你在这两个函数中所做的事情基本相同,所以如果你真的想要两个函数,你可以从另一个调用一个。而不是有两个单独的Cadena :: Cadena(const char * cad)和Cadena :: Cadena(const char * cad,unsigned lon),你可以使用Cadena :: Cadena(const char * cad,unsigned lon = 0),你可以打电话给Cadena tmp(c),它会起作用。
所以构造函数将是
Cadena::Cadena(const char* cad, unsigned int lon = 0) {
tam_ = (lon > 0 ? lon: strlen(cad));
s_ = new char[tam_ + 1];
strcpy(s_, cad);
s_[tam_] = '\0';
}
你的主/测试者可以这样调用。
int main()
{
char s[] = "Hello";
Cadena c(s);
return 0;
}