Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;实例';s地址更改_C++ - Fatal编程技术网

C++ C++;实例';s地址更改

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

我制作了一个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 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.
}