2016-04-19 4 views
-3

Ну, я новичок на C++, и я тренировался с конструкторами. Я создаю плохую версию класса String, и мне было предложено выполнить следующую задачу:Неоднозначный конструктор

a) Создайте конструктор, где вы можете сделать преобразование от const char* до String.

b) Создайте конструктор с «n» первыми буквами из const char*. Если «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'; 
} 

Моя проблема возникает, когда я пытаюсь проверить их на мой основной метод, где я получаю эту ошибку: «c1 неоднозначное».

Я попытался сделать это с помощью фиктивного параметра (объявляющего моего параметр unsigned как int без имени в моем заголовке), но я хотел бы initizialite этого второго параметра на 0, и я не могу сделать это, используя фиктивный параметр.

Я знаю, что компилятор не знает, какой конструктор должен использовать, но я хотел бы как-то это сделать. Может кто-нибудь мне помочь? Извините за мой плохой английский. не

+0

Показать основной способ пожалуйста. – songyuanyao

+0

Почему цикл for вместо просто strcpy во втором конструкторе? – kfsone

+4

Пожалуйста, отправьте сообщение [mcve]. Похоже, у вас есть аргумент по умолчанию для параметра длины во втором конструкторе. Если это так, конечно, это неоднозначно. Как компилятор должен знать, хотите ли вы вызвать первый конструктор, или второй со вторым аргументом, равным нулю? – Praetorian

ответ

2

I'm creating a bad version of String class...

НЕТ НЕТ НЕТ. Это никогда не нужно делать. Вы говорите, что вы новичок в C++, это не значит, что вы будете писать «плохой» код, возможно, это наивно, долго, имеет плохой синтаксис и не лучшее решение, но это не делает его «плохим», , Кроме того, если вы действительно думаете, что ваш класс строк «плохой», я предлагаю вам его переделать. Вы участвуете в процессе обучения, не намеренно пишете код, который вам знает ниже вашего стандарта. Как вы сейчас код, будет влиять на то, как вы пишете «лучший» код в будущем, даже если считаете, что это не так.

Поэтому, пожалуйста, для вашей пользы и для будущих людей, которые будут работать с вашим кодом, никогда не пытайтесь уйти с «плохим» кодом. Ура!

+0

Да, я думаю, ты прав. Я переписал его, и я попытаюсь сделать это, просто используя один конструктор вместо двух из них. Я думаю, что это можно сделать как-то. Большое спасибо! – xFunkyTImes

+2

Это не ответ, это должен быть просто комментарий. – Barmar

-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; 
} 
+1

Ваш конструктор не использует 'lon' ни для чего. И как он отличает вызывающий конструктор с 1 аргументом, который должен скопировать всю строку и быть вызванным с помощью 'n = 0', который должен создать пустую строку? – Barmar

+0

Я согласен с @Barmar. Возможно, значение 'lon' по умолчанию должно быть -1, и в этом случае вести себя как первый конструктор OP, а if> = 0, вести себя как второй конструктор OP? –

+0

ха-ха. Я забыл, я был в спешке. Теперь я рассматриваю lon в функции. –

Смежные вопросы