我正在尝试运行以下C ++代码来理解使用MS Visual Studio 15的类继承。在构建并运行代码之后,我收到一条消息,说MS VS已停止工作。如果有人能帮我理解我做错了什么,我真的很感激。
#include<cstdio>
#include<string>
#include<conio.h>
using namespace std;
// BASE CLASS
class Animal {
private:
string _name;
string _type;
string _sound;
Animal() {};
protected:
Animal(const string &n, const string &t, const string &s) :_name(n), _type(t), _sound(s) {};
public:
void speak() const;
};
void Animal::speak() const {
printf("%s, the %s says %s.\n", _name, _type, _sound);
}
// DERIVED CLASSES
class Dog :public Animal {
private:
int walked;
public:
Dog(const string &n) :Animal(n, "dog", "woof"), walked(0) {};
int walk() { return ++walked; }
};
int main(int argc, char ** argv) {
Dog d("Jimmy");
d.speak();
printf("The dog has been walked %d time(s) today.\n", d.walk());
return 0;
_getch();
}
答案 0 :(得分:1)
printf("%s, the %s says %s.\n", _name, _type, _sound);
您不能std::string
使用printf()
。
使用
printf("%s, the %s says %s.\n", _name.c_str(), _type.c_str(), _sound.c_str());
代替。
我宁愿建议使用std::cout
来使所有内容在c ++中无缝地工作。
答案 1 :(得分:1)
问题是speak方法尝试使用printf来打印字符串对象。
printf function is not suitable for printing std::string objects。它适用于char数组,用于表示C语言中的字符串。 如果你还想使用printf,你需要将你的字符串转换为char数组。这可以按如下方式完成:
printf("%s, the %s says %s.\n", _name.c_str(), _type.c_str(), _sound.c_str());
更优雅的解决方案是在&#34; C ++&#34;中打印数据。方式,使用std :: cout:
//include declaration at the top of the document
#include <iostream>
...
//outputs the result
cout <<_name + ", the " + _type + " says " + _sound << "." << endl;
答案 2 :(得分:0)
%s
与std::string
的{{3}}期望printf
,而不是printf("%s, the %s says %s.\n", _name, _type, _sound);
,它们不是同一回事。所以const char*
不起作用,不应该编译。
您可以使用c-style null-terminated byte string,这将返回printf("%s, the %s says %s.\n", _name.c_str(), _type.c_str(), _sound.c_str());
。如
std::cout
或者std::string
使用cout << _name << ", the " << _type << " says " << _sound << ".\n";
,如:
AND COL_INGREDIENTI like '%hi%' and COL_INGREDIENTI like '%try%'