您好,我对某些代码有疑问。 这段代码可以正常工作吗?
我认为我需要使用#include cstring
我问我的老师,他告诉我代码本身是好的,并且 它应该与#include字符串
一起使用这是正确的吗?有人可以解释一下吗?谢谢。
#include <iostream>
#include <string> //strcpy() works with string?
using namespace std;
class libraryBook{
private:
char title [80]; //cstring
int available;
public:
libraryBook(char initTitle[]);//cstring as argument
};
libraryBook::libraryBook(char initTitle[]){
strcpy(title, initTitle);
available = 1;
}
int main() {
libraryBook b1 ("computing"); //what would be the output without changing the code ?
return 0 ;
}
答案 0 :(得分:1)
简而言之,程序“按原样”可能会编译,也可能不会编译。如果要使用<cstring>
函数(如@ user4581301的注释所指出的那样),则需要包含strcpy()
。
在包含<cstring>
之后,该程序的输出为空,因为您没有打印任何内容。但实际上,您不应该使用字符数组来代替C ++中的std::string
。您可以在here上找到代码的演示。
答案 1 :(得分:1)
使用<cstring>
来代替<string>
,但即使更正了标题,程序也没有输出。
我认为我需要使用#include cstring
我问老师,他告诉我代码本身是不错的,并且应该与#include字符串一起使用
您认为正确,而老师是错误的 1 。 C++ Standard不能保证通过包含strcpy
使<string>
可用。
1 排序错误。无法保证<string>
提供strcpy
或最终包含<cstring>
的标头链,但是没有人说不能。只是不要指望它。文件应始终包含其需要的所有标头 2 ,以防止发生可避免的错误。当他们告诉您您的代码正确时,老师也可能被他们的大脑愚弄了,看到一个c,而没有c。它们可能意味着您要使用旧的C头文件<string.h>
。很难说。
2 有时,您会找到一个标头,希望它包含另一个标头,而不是forward declares另一个标头的部分,它需要避免编译时的开销。包括另一个标题。
答案 2 :(得分:1)
至少在我看来,您老师的想法明显更好。一个合理的起点是这样的:
#include <string>
class LibraryBook {
std::string name;
int available;
public:
LibraryBook(std::string const &name, int available = 1)
: name(name)
, available(available)
{}
};
然后创建一本书将如下所示:
LibraryBook book("Steal This Code");
由于我们未包含任何代码来写出任何内容,因此不会产生任何输出(除了返回指示成功退出的代码外)。