不明确的构造函数

时间:2016-04-19 01:48:24

标签: c++ parameters constructor

好吧,我是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并且我不能使用虚拟参数进行此操作。

我知道编译器不知道哪个构造函数必须使用,但我想以某种方式这样做。有人能帮助我吗?抱歉我的英语不好。

2 个答案:

答案 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;
}