C++ C++;实例';s地址更改
我制作了一个DirList类来获取特定目录中的所有目录、文件列表。下面是目录代码C++ C++;实例';s地址更改,c++,C++,我制作了一个DirList类来获取特定目录中的所有目录、文件列表。下面是目录代码 class DirList { private: std::string dir_path_; int type_; DIR *dir_; public: DirList(std::string dir_path); DirList(std::string dir_path, int type); ~DirList(); std::string GetNe
class DirList {
private:
std::string dir_path_;
int type_;
DIR *dir_;
public:
DirList(std::string dir_path);
DirList(std::string dir_path, int type);
~DirList();
std::string GetNext();
};
DirList::DirList(std::string dir_path) {
DirList(dir_path, 0);
}
DirList::DirList(std::string dir_path, int type) {
dir_path_ = dir_path;
type_ = type;
dir_ = opendir(dir_path_.c_str());
if (dir_ == NULL)
std::cout << "DirList - opendir error - " << dir_path_;
Logger(Logger::kError) << "path " << dir_path_ << " type " << type_;
Logger(Logger::kError) << "address " << (uint64_t)this;
}
DirList::~DirList() {
if (closedir(dir_) != 0)
std::cout << "DirList - close error - " << dir_path_;
}
std::string DirList::GetNext() {
Logger(Logger::kError) << "path " << dir_path_ << " type " << type_;
Logger(Logger::kError) << "address " << (uint64_t)this;
if (dir_ == NULL) {
std::cout << "DirList - opendir error - " << dir_path_;
return "";
}
dirent *dirent;
if(type_ == 0){
while ((dirent = readdir(dir_)) != NULL) {
// Jump current and upper dir
if (dirent->d_name[0] == '.')
continue;
else
break;
}
}
else{
while ((dirent = readdir(dir_)) != NULL) {
// Jump current and upper dir
if ((dirent->d_name[0] == '.') || (dirent->d_type != type_))
continue;
else
break;
}
}
if (dirent == NULL)
return "";
return dirent->d_name;
}
当这个地址在构造函数中,而这个地址在GetNext方法中时,DirList在某些代码中工作得很好。但当这个地址不同时,DirList在某些代码中并不是wokring。。。因此,dir_path_uu、type_uu的值错误
我不明白为什么实例的地址发生了变化。我不寻址操作,只使用new分配内存
我的develenv是ubuntu17.1064位和铿锵++3.8。但我试过Ubuntu 16.04 64位,铿锵-++4.0。叮当声-++5.0。。。但同样的问题也出现了
谢谢我找到了原因
DirList::DirList(std::string dir_path){DirList(dir_path,0);}
“DirList(dir_path,0)”不在此实例中初始化。它只是临时的例子
要解决这个问题
DirList::DirList(std::string dir_path):DirList(dir_path,0){}
您能演示一下如何使用这个类吗?值得注意的是,您没有遵守三个规则,并且您的类中确实有一个原始指针。我添加了用法代码。无关:DirList
违反了三个规则。这迟早会咬到你的。单击链接并查找。
// main() in main.cc
DirList dir_list(host_proc_path, DT_DIR);
std::string pid;
while (!(pid = dir_list.GetNext()).empty()){
... // this working well.
}
// Parsing() Method in host_parser.cc - host_parser is class to get hostinfo.
DirList dir_list_nic(kSysNetPath);
std::string net_iface;
while (!(net_iface = dir_list_nic.GetNext()).empty()) {
... // this is'n't wokring. dir_path_ and type_ has wrong value.
}