我是C ++的新手,我正在努力做到以下几点:
1)我创建了一个名为Objects的对象类,其中包含对象的名称和用于标识它们的数字。
2)我创建了一个继承自list的类Group,如下所示:
#include "objects.h"
#include <list>
#include <iostream>
#include <string> using namespace std;
class Group : public std::list<Objects*> { private:
string groupname;
public:
Group(string groupname);
virtual ~Group() {} //destructor
virtual string getGroupName() const;
virtual void showlist(ostream & sl) const; };
3)然后,我实现了方法showlist,如下所示:
void Groupe::showlist(ostream & sl) const{
printf("I'm here 1\n");
for(auto it = this->begin(); it != this->end(); it++){
printf("I'm here 2\n");
sl << this->getGroupName() << "test" << "test\n" << endl;
std::cout << "I'm alive";
} }
方法getGroupName如下:
string Group::getGroupName() const{
return groupname;
}
4)在主程序中,我创建了一个指向Group类型变量的指针。代码编译没有任何错误,但是当我执行它时,我意识到程序进入方法showlist并在没有执行for循环的情况下退出。我通过使用printf放置消息来测试它。只是消息“前方法”,“我在这里1”,以及“后方法”在终端显示。它没有显示“我在这里2”。我从main打电话如下:
Group *lgroup = new Group[5] {Group("g1"), Group("g2"),Group("g3"),Group("g4"),Group("g5")};
printf("Before method\n");
lgroup->showlist(sl);
printf("After method\n");
cout << sl.str() << endl;
你能帮我理解循环没有执行的原因吗?
更新
程序没有进入循环,因为列表是空的,如成员的答案所述。
至于从List
继承的这种情况是一个约束,我已经在主函数中填写了如下列表:
Groupe *lgroup1 = new Groupe("g1");
Object *objets[3];
objets[1] = new File("/home/Documents", "b2.jpg",0,0);
objets[2] = new File("/home/Documents", "b3.jpg",0,0);
objets[3] = new File("/home/Documents", "b4.jpg",0,0);
lgroup1->push_back(objets[1]);
lgroup1->push_back(objets[2]);
lgroup1->push_back(objets[3]);
其中File
是一个继承自类Objects
的类。这样程序就可以编译和执行。在命令行中,它显示了类Groupe
的属性,即g1
。我想使用已经在类display
中实现的方法Objects
但是当我尝试这样做时,编译器显示了这个错误:
error: 'const class Group' has no member named 'display'
sl << this->display(cout) << '\n' << endl;
所以,我的问题是如何让课程Group
继承List
(已经完成)和Objects
的方法?
答案 0 :(得分:6)
因为您没有在列表中添加任何内容。您正在数组中创建五个空的,不相关的列表,然后单步执行(空)第一组。
答案 1 :(得分:3)
忽略您不应该从标准库容器派生的那一刻(参见Is there any real risk to deriving from the C++ STL containers?)......
该行
DerivedClass
为5个Group对象分配内存,并将该内存分配给Group *lgroup = new Group[5] {Group("g1"), Group("g2"),Group("g3"),Group("g4"),Group("g5")};
。但是,lgroup
仍然没有包含在列表中的项目。因此,lgroup
等于lgroup->begin()
。
如果您希望其他lgroup->end()
包含在Group
中,则需要使用:
lgroup
要实现这一目标,您需要将Group *lgroup = new Group;
lgroup->push_back(new Group("g1"));
lgroup->push_back(new Group("g2"));
lgroup->push_back(new Group("g3"));
lgroup->push_back(new Group("g4"));
lgroup->push_back(new Group("g4"));
作为Group
的子类型。最好将课程改为:
Object
然后使用
class Group : public Object
{
private:
string groupname;
public:
Group(string groupname);
virtual ~Group() {}
std::list<Objects*>& getObjects();
std::list<Objects*> const& getObjects() const;
virtual string getGroupName() const;
virtual void showlist(ostream & sl) const;
std::list<Objects*> objects_;
};
答案 2 :(得分:0)
对于第一个问题,程序没有进入循环,因为列表是空的,如成员的答案中所述。
对于第二个问题,没有必要使用多重继承来继承类Object
中的方法。对于这种情况,display
是我想要使用的方法。有必要用指针调用它:
for(list<Object*>::const_iterator it = this->begin(); it != this->end(); it++){
sl << this->getGroupName() << ' ' ;
(*it)->display(sl);