Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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++ STL集的解引用迭代器_C++_Inheritance_Stl_Set_Dereference - Fatal编程技术网

C++ STL集的解引用迭代器

C++ STL集的解引用迭代器,c++,inheritance,stl,set,dereference,C++,Inheritance,Stl,Set,Dereference,我在从STL集合继承时遇到问题(我认为): 这是素数类: class Prime : public set<A> { private: // private data members. public: // C'tor... void printParticularA(const int& id); } 我也试过: void Prime::printParticularA(const int& id) { *(find(AFinder(id))).p

我在从STL集合继承时遇到问题(我认为):

这是素数类:

class Prime : public set<A> {
private:
  // private data members.
public:
  // C'tor...
  void printParticularA(const int& id);
}
我也试过:

void Prime::printParticularA(const int& id) {
  *(find(AFinder(id))).printReport();
}
注意:假设类B有print()方法。
注2:AFinder是一个仅使用id数据创建虚拟对象的类

问题是,当“find”找到对象时,它返回const_迭代器(因为集合中的每个对象都是const),当我取消引用它时,我会得到对象的副本(?),但其中的B列表是空的
“->”版本也会发生这种情况

现在我知道set不允许我更改对象,但我不打算更改对象(正如您在printReport成员函数的声明中所看到的)

我感谢你在这方面的帮助

编辑:谢谢大家,你们帮了我很多,尤其是学会了什么不该做。
我解决了这个问题,但它既不在集合中,也不在列表中,也不在这里介绍的任何课程中。
我的错误是理解了给我的问题(是的,这是我的家庭作业,我对c++还是新手)。
如果您觉得我浪费了您的时间,请原谅。
我希望我能从你所有的经验中学习,并有一天帮助别人

总之,谢谢!!:)

你的代码乱七八糟。这个问题看起来并不是直接与集合或迭代器联系在一起,而是做了一些不好的事情

首先,让你的op
所有这些都可能会使您描述的问题消失,如果没有,请发布一个完整的可编译示例,其中包含您看到的内容和您期望的内容。

尽管您尚未包含
列表的实现,但问题可能就在那里。更准确地说,
List
begin()
end()
成员函数可能会被破坏。它们返回的值很可能相同(或无效),导致基于范围的for循环无所作为。这当然是基于
集合::find
返回的是有效的迭代器,而不是结束迭代器

以下示例是对问题中代码的修改。它使用
std::list
而不是
list
,并且不使用
AFinder
,因为您没有为它包含代码

#include <set>
#include <list>
#include <iostream>

struct B
{
    int id_;
    explicit B(int id) : id_(id) {}
    void print() const
    {
        std::cout << "B::id = " << id_ << std::endl;
    }
};

class A : public std::list<B>
{
public:
    explicit A(int id) : id_(id) {}

    bool operator<(const A& rhs) const
    {
        return id_ < rhs.id_;
    }

    bool operator==(const A& other) const
    {
        return id_ == other.id_;
    }

    void printReport() const
    {  
        for(auto& item : *this)
        {
            item.print();
        }
    }

private:  

    // data members.  
    int id_;

};


class Prime : public std::set<A>
{
public:

    void printParticularA(const int& id)
    {
        std::cout << "finding " << id << std::endl;
        auto el = find(A(id));
        if(el == cend())
        {
            std::cout << "not found" << std::endl;
        }
        else
        {
            find(A(id))->printReport();
        }
        std::cout << "done finding " << id << std::endl;
    }
};


int main()
{
    Prime p;

    A   a1(1);
    a1.push_back(B(1));
    a1.push_back(B(2));
    a1.push_back(B(3));
    p.insert(a1);

    A   a2(2);
    a2.push_back(B(4));
    a2.push_back(B(5));
    a2.push_back(B(6));
    p.insert(a2);

    p.printParticularA(1);

    p.printParticularA(2);

    // doesn't exit
    p.printParticularA(3);
}
#包括
#包括
#包括
结构B
{
int-id_2;;
显式B(int-id):id_u(id){}
void print()常量
{

STD::CUT< P>你的代码真的违反了C++的许多规则。你为什么不试试这样的SMTH:

#include <iostream>
#include <list>
#include <map>

using namespace std;

class SimpleInt {
public:  
  int data_;

  SimpleInt(const int data): data_(data) {};
  void print() const {cout << data_ << " ";};
};

template <typename T>
class A {  
private:  
  // private data members.  
public:  
  list<T> list_of_B_; // this is for simlicity. Make getters as you need
  const int id_; // delete it or copy to map. You sholdn't change it.

  A(int id) : list_of_B_(), id_(id) {} 
  A(const A<T>& copy) : list_of_B_(copy.list_of_B_), id_(copy.id_) {} //copy data members  
  A(A<T>&& copy) : list_of_B_(::std::move(copy.list_of_B_)), id_(copy.id_) {} //move data members  

  void printReport() const {  
    for(const T& item : list_of_B_){ item.print(); }
  }

};

template <typename T>
class Prime {
private:
  // private data members.
public:
  // The main difference with your source
  map<int, T> map_of_A_; // this is for simlicity. Make getters as you need
  // C'tor...
  void printParticularA(const int& id) {
    auto it = map_of_A_.find(id);
    if (it != map_of_A_.end())
      it->second.printReport();
  }
};

int _tmain(int argc, _TCHAR* argv[])
{
  typedef A<SimpleInt> ASimpled;
  Prime<ASimpled> prime;
  ASimpled a(1);
  a.list_of_B_.push_back(SimleInt(1));
  a.list_of_B_.push_back(SimleInt(2));
  a.list_of_B_.push_back(SimleInt(3));
  ASimpled b(2);
  b.list_of_B_.push_back(SimleInt(10));
  b.list_of_B_.push_back(SimleInt(20));
  b.list_of_B_.push_back(SimleInt(30));
  prime.map_of_A_.insert(make_pair(a.id_, a));
  prime.map_of_A_.insert(make_pair(b.id_, b));

  prime.printParticularA(2);

return 0;
}
#包括
#包括
#包括
使用名称空间std;
类SimpleInt{
公众:
int数据;
SimpleInt(const int data):数据{(data){};
void print()常量{cout second.printReport();
}
};
int _tmain(int argc,_TCHAR*argv[]
{
类型定义A为示例;
素数;
样本a(1);
a、 将列表中的内容向后推(SimleInt(1));
a、 列表中的B。推回(SimleInt(2));
a、 列表中的B。推回(SimleInt(3));
样本b(2);
b、 列表中的b。推回(SimleInt(10));
b、 列表中的b。推回(SimleInt(20));
b、 列表中的b。推回(SimleInt(30));
插入的素数映射(生成对(A.id,A));
插入的素数映射(生成对(b.id,b));
质数,质数(2);
返回0;
}

从STL容器继承是一个坏主意:标准容器不是为公共继承而设计的。你确定
查找()
成功吗?你应该始终检查返回值,只有当它是
!=end()
时才取消引用它。我确定find()成功。我已经检查了返回值(不管上面写了什么)。@Anycorn假设我已经处理了链接中提到的“删除”问题,为什么这段代码不起作用?find()返回一个对象(当然)但是它的列表是空的。顺便说一句,列表不是STL,它是我的列表容器的实现。这是我的错,但我没有在这里写所有的代码。op<在我的代码中是常量,复制c'tor验证复制的数据(在方法体中),如果有错误(所以库存的不够好),则抛出异常。以及find()方法设置为“内部查找”。你究竟为什么要在复制构造函数中验证数据?它只会创建输入的一个副本,如果这是无效的,你应该在它以这种方式出现时抛出。不过,复制构造函数在这里不是问题。即使我使用默认的构造函数,我仍然会遇到这个问题。如果你告诉我我违反了哪些规则,我会很高兴st所以我不会再破坏它们…你已经被告知从std容器继承。我再次查看你的代码。你在A的ctor中的问题-你没有复制你的id。因此,在插入到Prime后,你的数据被复制,id被破坏。然后找到你没有测试的return end()。你尝试取消引用end()并获取您的异常。但无论如何,请将此代码发送到垃圾箱。
\u tmain()
违反了标准的哪一部分?它在$3.6.1中。我懒得在project write'n'forget中更改它。我可以吗?
#include <set>
#include <list>
#include <iostream>

struct B
{
    int id_;
    explicit B(int id) : id_(id) {}
    void print() const
    {
        std::cout << "B::id = " << id_ << std::endl;
    }
};

class A : public std::list<B>
{
public:
    explicit A(int id) : id_(id) {}

    bool operator<(const A& rhs) const
    {
        return id_ < rhs.id_;
    }

    bool operator==(const A& other) const
    {
        return id_ == other.id_;
    }

    void printReport() const
    {  
        for(auto& item : *this)
        {
            item.print();
        }
    }

private:  

    // data members.  
    int id_;

};


class Prime : public std::set<A>
{
public:

    void printParticularA(const int& id)
    {
        std::cout << "finding " << id << std::endl;
        auto el = find(A(id));
        if(el == cend())
        {
            std::cout << "not found" << std::endl;
        }
        else
        {
            find(A(id))->printReport();
        }
        std::cout << "done finding " << id << std::endl;
    }
};


int main()
{
    Prime p;

    A   a1(1);
    a1.push_back(B(1));
    a1.push_back(B(2));
    a1.push_back(B(3));
    p.insert(a1);

    A   a2(2);
    a2.push_back(B(4));
    a2.push_back(B(5));
    a2.push_back(B(6));
    p.insert(a2);

    p.printParticularA(1);

    p.printParticularA(2);

    // doesn't exit
    p.printParticularA(3);
}
#include <iostream>
#include <list>
#include <map>

using namespace std;

class SimpleInt {
public:  
  int data_;

  SimpleInt(const int data): data_(data) {};
  void print() const {cout << data_ << " ";};
};

template <typename T>
class A {  
private:  
  // private data members.  
public:  
  list<T> list_of_B_; // this is for simlicity. Make getters as you need
  const int id_; // delete it or copy to map. You sholdn't change it.

  A(int id) : list_of_B_(), id_(id) {} 
  A(const A<T>& copy) : list_of_B_(copy.list_of_B_), id_(copy.id_) {} //copy data members  
  A(A<T>&& copy) : list_of_B_(::std::move(copy.list_of_B_)), id_(copy.id_) {} //move data members  

  void printReport() const {  
    for(const T& item : list_of_B_){ item.print(); }
  }

};

template <typename T>
class Prime {
private:
  // private data members.
public:
  // The main difference with your source
  map<int, T> map_of_A_; // this is for simlicity. Make getters as you need
  // C'tor...
  void printParticularA(const int& id) {
    auto it = map_of_A_.find(id);
    if (it != map_of_A_.end())
      it->second.printReport();
  }
};

int _tmain(int argc, _TCHAR* argv[])
{
  typedef A<SimpleInt> ASimpled;
  Prime<ASimpled> prime;
  ASimpled a(1);
  a.list_of_B_.push_back(SimleInt(1));
  a.list_of_B_.push_back(SimleInt(2));
  a.list_of_B_.push_back(SimleInt(3));
  ASimpled b(2);
  b.list_of_B_.push_back(SimleInt(10));
  b.list_of_B_.push_back(SimleInt(20));
  b.list_of_B_.push_back(SimleInt(30));
  prime.map_of_A_.insert(make_pair(a.id_, a));
  prime.map_of_A_.insert(make_pair(b.id_, b));

  prime.printParticularA(2);

return 0;
}