Вопрос о перегрузке логического оператора в C ++ - PullRequest
0 голосов
/ 25 февраля 2020

Для этого назначения нам не разрешено использовать std :: string.

У меня есть конструктор, который принимает C -строку, смоделированную после цепи ДНК.

DNAStrand::DNAStrand(const char* startingString) {
    length = strlen(startingString);
    bases = new char[length + 1] {'A','C','G','T',0};
}

Затем я попытался перегрузить логический оператор, который проверял бы созданную мной цепочку, против другой.

bool DNAStrand::operator==(const DNAStrand& other) const {
    if (length != other.length)
        return false; //can't be the same if we don't have same # items

    //Same size, walk through items looking for mismatch
    for (int i = 0; i < length; i++) {
        if (bases[i] != other.bases[i])
            return false;
    }

    return true; //Must be identical
}

Однако, когда я пытаюсь проверить его, используя приведенную ниже строку кода, isMatch3 возвращает true .

DNAStrand str2("AACC");
bool isMatch3 = (str2 == DNAStrand("AAGC"));

Я почти уверен, что есть проблема с for для l oop, когда он должен перебирать каждый символ в строке C, но я не могу понять, что проблема в том. На мой взгляд, это либо так, либо мой первоначальный конструктор неверен.

1 Ответ

0 голосов
/ 25 февраля 2020

Когда вы создаете объект DNAStrand, вы нигде не храните startingString (вы сохраняете только его длину). Более того, вы устанавливаете одну и ту же базовую «ACGT» для всех ваших объектов:

DNAStrand::DNAStrand(const char* startingString) {
    length = strlen(startingString);
    bases = new char[length + 1] {'A','C','G','T',0};
}

Когда вы сравниваете bases в вашем l oop, вы сравниваете «ACGT» как в левом, так и в правом объектах и всегда возвращает true.

Решить, сохраняя startstring:

DNAStrand::DNAStrand(const char* startingString) {
    length = strlen(startingString);
    bases = new char[length + 1] {startingString};
}
...