【C++】调试问题Bug记录
static 类型的变量需要在类外实现
例子:PrimerC++13章StrVec的实现
/tmp/ccHWCyce.o:在函数‘StrVec::push_back(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)’中:
StrVec.cpp:(.text+0x38):对‘StrVec::alloc[abi:cxx11]’未定义的引用
/tmp/ccHWCyce.o:在函数‘StrVec::alloc_n_copy(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const*)’中:
StrVec.cpp:(.text+0x82):对‘StrVec::alloc[abi:cxx11]’未定义的引用
/tmp/ccHWCyce.o:在函数‘StrVec::free()’中:
StrVec.cpp:(.text+0x11e):对‘StrVec::alloc[abi:cxx11]’未定义的引用
StrVec.cpp:(.text+0x153):对‘StrVec::alloc[abi:cxx11]’未定义的引用
/tmp/ccHWCyce.o:在函数‘StrVec::reallocate()’中:
StrVec.cpp:(.text+0x2c0):对‘StrVec::alloc[abi:cxx11]’未定义的引用
/tmp/ccHWCyce.o:StrVec.cpp:(.text+0x32f): 跟着更多未定义的参考到 StrVec::alloc[abi:cxx11]
collect2: error: ld returned 1 exit status
之前写单例模式的时候遇到过一次,没搞清除也没有记住,给自己一个差评。
修改
在类外实现:allocator<string> StrVec::alloc;
获得随机数
#include <time.h>
#include <stdlib.h>
int random() {
srand((int)time(0));
//获得1到100的随机数
return rand()%100;
}
must take exactly one argument
输入输出运算符必须是非成员函数,可以在类外面定义,然后在类里声明为友元。
‘std::istream& Sales_data::operator>>(std::istream&, Sales_data&)’ must take exactly one argument
istream& operator>>(istream &is, Sales_data& sd) {
输出char指针的地址
1.如果给cout提供一个指针,它将打印指针所指向的地址单元的地址,但如果指针类型为char *,则cout将打印char *指针所指向的字符串。
2.如果要显示char *指针所指向的地址单元的地址,需要将char *类型的指针强制转化为另一种类型的指针,可以将char *类型的指针强制转化为int *类型指针。
passing ‘const Sales_data’ as ‘this’ argument discards qualifiers [-fpermissive]
编译器认为成员函数可能会修改被const限定的变量
class Sales_data {
friend bool operator<(const Sales_data&, const Sales_data&);
public:
Sales_data(const std::string& s, double p): isbn(s), price(p) { }
std::string isBn() { return isbn; } //error
/*
*修改为
*std::string isBn() const { return isbn; }
*/
private:
std::string isbn;
double price;
};
bool operator<(const Sales_data& sd1, const Sales_data& sd2) {
return sd1.isBn() < sd2.isBn();
}