仅仅就可以通过编译的角度来说,
#include<iostream>
#include<string>
using std::cout;
#ifndef STRNGBAD_H_
#define STRNGBAD_H_
class StringBad
{
private:
char*str;
int len;
static int num_strings;
public:
StringBad(const char*s);
StringBad();
~StringBad();
friend std::ostream & operator<<(std::ostream & os, const StringBad &st);
};
#endif
int StringBad::num_strings = 0;
StringBad::StringBad(const char*s)
{
len = std::strlen(s);
str = new char[len + 1];
std::strcpy(str, s);
num_strings++;
cout << num_strings << ":\"" << str << "\"object created\n";
}
StringBad::StringBad()
{
len = 4;
str = new char[4];
std::strcpy(str, "C++");
num_strings++;
cout << num_strings << ":\"" << str << "\"default object created\n";
}
StringBad::~StringBad()
{
cout << "\"" << str << "\"object deleted,";
--num_strings;
cout << num_strings << "left\n";
delete[]str;
}
std::ostream & operator<<(std::ostream & os, const StringBad & st)
{
os << st.str;
return os;
}
int main()
{}
你没有main函数
如果strcpy还有报错,是因为你用了vc++ 2012或者更新的版本,默认不允许不安全的函数。
可以使用strcpy_s代替,修改如下:
#include "stdafx.h"
#include<iostream>
#include<string>
using std::cout;
#ifndef STRNGBAD_H_
#define STRNGBAD_H_
class StringBad
{
private:
char*str;
int len;
static int num_strings;
public:
StringBad(const char*s);
StringBad();
~StringBad();
friend std::ostream & operator<<(std::ostream & os, const StringBad &st);
};
#endif
int StringBad::num_strings = 0;
StringBad::StringBad(const char*s)
{
len = std::strlen(s);
str = new char[len + 1];
strcpy_s(str, len, s);
num_strings++;
cout << num_strings << ":\"" << str << "\"object created\n";
}
StringBad::StringBad()
{
len = 4;
str = new char[4];
strcpy_s(str,len, "C++");
num_strings++;
cout << num_strings << ":\"" << str << "\"default object created\n";
}
StringBad::~StringBad()
{
cout << "\"" << str << "\"object deleted,";
--num_strings;
cout << num_strings << "left\n";
delete[]str;
}
std::ostream & operator<<(std::ostream & os, const StringBad & st)
{
os << st.str;
return os;
}
int main()
{}