构造函数不明确



好吧,我是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_] = '';
}

当我试图在我的主方法中测试它们时,我的问题来了,在那里我得到了这个错误:"c1是模糊的"。

我试着用一个伪参数来实现这一点(将我的unsigned参数声明为头中没有名称的int),但我想将第二个参数初始化为0,我不能用伪参数来完成这一点。

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

我正在创建一个糟糕版本的String类。。。

否否。这从来都不是你应该做的事情。你说你是c++的初学者,这并不意味着你会写"糟糕"的代码,也许它很天真,很长,语法不好,不是最好的解决方案,但这并不会让它变得"糟糕"。此外,如果你真的认为你的字符串类"不好",我建议你重做。你正在学习,不要故意编写你知道低于标准的代码。你现在的编码方式将影响你将来如何写"更好"的代码,即使你认为不会。

因此,为了你的利益和未来使用你的代码的人,请永远不要试图逃脱"坏"代码的惩罚。干杯

实际上,您只需要一个构造函数。另外,您在两个函数中所做的基本上是相同的,所以如果您真的想要两个函数,您可以从另一个函数中调用一个。您可以使用Cadena::Cadena(const char*cad,unsigned lon),而不是使用两个独立的Cadena:(const char*cad)和Cadena:。

所以构造函数将是

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_] = '';
}

您的主/测试程序可以这样调用。

int main()
{
    char s[] = "Hello";
    Cadena c(s);
    return 0;
}

最新更新