C++ 关于C++;

C++ 关于C++;,c++,operator-overloading,C++,Operator Overloading,对于此分配,我们不允许使用std::string 我有一个构造函数,它接受一个模仿DNA链的C字符串 DNAStrand::DNAStrand(const char* startingString) { length = strlen(startingString); bases = new char[length + 1] {'A','C','G','T',0}; } 然后,我尝试重载一个布尔运算符,该运算符将检查我创建的串与另一个串 bool DNAStrand::oper

对于此分配,我们不允许使用std::string

我有一个构造函数,它接受一个模仿DNA链的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
}

我很确定for循环存在一个问题,它应该迭代C字符串中的每个字符,但我不知道问题是什么。在我看来,要么是这样,要么是我原来的构造函数错了。

当你创建一个
DNAStrand
对象时,你没有将
startingString
存储在任何地方(你只保留它的长度)。更重要的是,您正在为所有对象设置相同的基础“ACGT”:

DNAStrand::DNAStrand(const char* startingString) {
    length = strlen(startingString);
    bases = new char[length + 1] {'A','C','G','T',0};
}
当您在循环中比较
base
时,您正在比较左对象和右对象中的“ACGT”,并且始终返回
true

解决它存储
开始字符串

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

请对字符串使用
std::string
而不是
char*
/
char[]
/
new
,这样您就不会有任何此类问题。您是否忘了为起始字符串中的实际值设置基数?目前看来,无论您传递给构造函数的是什么,基础都将是{'A'、'C'、'G'、'T',0}@walnut,为了清楚起见,我们不允许在这个赋值中使用std::string来“了解制作类似字符串的对象所涉及的内容并进行[我们]自己的内存管理”@DanBoing好的,这是没有帮助的。请注意,在实践中,你不会编写这样的代码。因为“代码> > BASE/C++”,总是以相同的值初始化,因为这似乎不是故意的。你的代码不是有效的C++。无法从
const char*
初始化
char
数组。
DNAStrand::DNAStrand(const char* startingString) {
    length = strlen(startingString);
    bases = new char[length + 1] {startingString};
}