我正在编写一个名为Word
的类,它处理 c 字符串并重载<
、>
、<=
、>=
运算符。
word.h
:
friend bool operator<(const Word &a, const Word &b);
word.cc
:
bool operator<(const Word &a, const Word &b) {
if(a == NULL && b == NULL)
return false;
if(a == NULL)
return true;
if(b == NULL)
return false;
return strcmp(a.wd, b.wd) < 0; //wd is a valid c string, EDIT: changed to strcmp
}
main
:
char* temp = NULL; //EDIT: i was mistaken, temp is a char pointer
Word a("blah"); //a.wd = [b,l,a,h]
cout << (temp<a);
我在operator<
方法的第一行之前收到分割错误 在main
的最后一行之后。我可以通过写来纠正问题
cout << (a>temp);
其中operator>
定义类似,我没有收到任何错误,但我的 作业需要(temp < a)
才能工作,所以这是我寻求帮助的地方。
编辑:我第一次犯了一个错误,我说temp是Word
型, 但它实际上是char*
型.所以我假设编译器转换 使用我的一个构造函数临时到Word
。我不知道会是哪一个 使用以及为什么这会起作用,因为第一个参数不是Word
.
这是我认为用于使用temp
进行Word
的构造函数:
Word::Word(char* c, char* delimeters="n") {
char *temporary = " ";
if(c == NULL)
c = temporary;
check(stoppers!=NULL, "(Word(char*,char*))NULL pointer"); // exits the program if the expression is false
if(strlen(c) == 0)
size = DEFAULT_SIZE; //10
else
size = strlen(c) + 1 + DEFAULT_SIZE;
wd = new char[size];
check(wd!=NULL, "Word(char*,char*))heap overflow");
delimiters = new char[strlen(stoppers) + 1]; // EDIT: changed to []
check(delimiters!=NULL,"Word(char*,char*))heap overflow");
strcpy(wd,c);
strcpy(delimiters,stoppers);
count = strlen(wd);
}
wd
属于char*
类型
感谢您查看这个大问题并尝试提供帮助。 让我知道您是否 需要更多代码来查看
我几乎可以肯定你不是想在堆上构造一个char
,其初始值是基于stoppers
大小的某个整数:
delimiters = new char(strlen(stoppers) + 1); // Should use [] not ()
你也在使用C++,我永远不会告诉你该怎么做,但请,除非你确切地知道没有危险,否则不要使用strcpy
.正是出于这个原因。
它是字符串的盲副本,当目标没有足够的空间时(就像您的错别字分配一样),事情就会变得糟糕。
编辑:
我也看到你使用的operator<
超载
a.wd < b.wd
并声称 .wds 是有效的 C 字符串。如果是这种情况,则不能对它们应用简单的<运算符,而必须使用strcmp
,strncmp
或其他一些完整的比较函数>
去掉构造函数的其他位:
Word::Word(char* c, char* delimeters=NULL) {
check(stoppers!=NULL, "(Word(char*,char*))NULL pointer"); //exits the program if the expression is false
delimiters = new char[strlen(stoppers) + 1];
check(delimiters!=NULL,"Word(char*,char*))heap overflow");
strcpy(delimiters,stoppers);
}
您正在分配和复制到输入参数 (delimiters
) 而不是成员变量 (stoppers
)。因此,当您调用:
delimiters = new char[strlen(stoppers) + 1];
在这里,stoppers == NULL
(从check
调用推断)所以strlen(NULL)
崩溃。
此外,在:
bool operator<(const Word &a, const Word &b)
您检查诸如a == NULL
之类的内容。这不需要,因为a
和b
是引用,因此对象为非 null。
如果wd
可以为 null,则需要更改这些内容以检查a.wd
和b.wd
。