帮忙修改C++ 代码了,很简单的

Timor君 发布于 2012/07/01 17:08
阅读 852
收藏 1

描述:
    Message保存当前的string类型的 message,同时set 保存拥有这个message的Folder。
    Folder 中的set 保存该Forlder中的所有Message指针。
代码如下:

#include <iostream>
#include <set>
#include <iterator>
using namespace std;

class Messge;
class Folder
{
public:
	Folder(){}
	void addMsg(Messge*);
	void removeMsg(Messge*);
	void show_all_msg()
	{
		for (set<Messge*>::const_iterator beg = m_msg.begin(); beg != m_msg.end(); ++beg)
		{
			cout << (*beg)->get_messge_content() << endl;
		}
	}
private:
	set<Messge*>  m_msg;
};
void Folder::addMsg(Messge* pMsg)
{
	m_msg.insert(pMsg);
}

void Folder::removeMsg(Messge* pMsg)
{
	m_msg.erase(pMsg);
}

class Messge
{
public:
	Messge(const string msg = ""): m_message(msg){}
	Messge(const Messge &msg): m_message(msg.m_message)
	{
		m_folder = msg.m_folder;
		
		for (set<Folder*>::const_iterator beg = m_folder.begin(); beg != m_folder.end(); ++beg)
		{
			(*beg)->addMsg(this);
		}
	}
	Messge& operator= (const Messge &);
	
	~Messge()
	{
		for (set<Folder*>::const_iterator beg = m_folder.begin(); beg != m_folder.end(); ++beg)
		{
			(*beg)->removeMsg(this);
		}
		m_folder.clear();
	}
	void save(Folder *);
	void remove(Folder *);

	const string get_messge_content() const { return m_message;}

private:

	string        m_message;	
	set<Folder*>  m_folder;
};
void Messge::save(Folder *p)
{
	m_folder.insert(p);
	p->addMsg(this);
}
void Messge::remove(Folder *p)
{
	p->removeMsg(this);
	m_folder.erase(p);
}
Messge& Messge::operator=(const Messge &rhs)
{
	if (&rhs != this)
	{
		for (set<Folder*>::const_iterator beg = m_folder.begin(); beg != m_folder.end(); ++beg)
		{
			(*beg)->removeMsg(this);
		}
		m_message = rhs.m_message;
		m_folder = rhs.m_folder;
		for (set<Folder*>::const_iterator beg = m_folder.begin(); beg != m_folder.end(); ++beg)
		{
			(*beg)->addMsg(this);
		}
	}
	return *this;
}


int main(int argc, char** argv)
{
	Messge name("huang");
	Messge CPP("C++");

	Folder test;
	Folder test1;
	name.save(&test);
	name.save(&test1);
	
	// 会显示 huang C++
	test.show_all_msg();

	return EXIT_SUCCESS;
	
}

VS2011错误提示:

 error C2227: left of '->get_messge_content' must point to class/struct/union/generic type

以下是问题补充:

@Timor君:新手问题,调试了一下午不知道怎么弄 (2012/07/01 17:09)
加载中
1
s
stevenluck
message 和 folder的顺序换换,或者把整个的message定义放在folder前面。仅仅declare class message好像不足够. 没有定义, complier怎么知道有个get...方法呢
1
开源中国驻成都办事处
开源中国驻成都办事处

http://blog.csdn.net/yunyun1886358/article/details/5672574

前置申明只能使用指针或引用 并不能调用申明类的成员函数

Timor君
Timor君
... 我又犯了这个错误。
1
johnzhang68
johnzhang68
// MessageTest.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include <set>
#include <iterator>
#include <string>

using namespace std;

class Folder;

class Messge
{
public:
	Messge(const string msg = ""): m_message(msg){}
	Messge(const Messge &msg);//: m_message(msg.m_message);
	//{
	//	m_folder = msg.m_folder;
		
	//	for (set<Folder*>::const_iterator beg = m_folder.begin(); beg != m_folder.end(); ++beg)
	//	{
	//		(*beg)->addMsg(this);
	//	}
	//}
	Messge& operator= (const Messge &);
	
	~Messge();
	//{
	//	for (set<Folder*>::const_iterator beg = m_folder.begin(); beg != m_folder.end(); ++beg)
	//	{
	//		(*beg)->removeMsg(this);
	//	}
	//	m_folder.clear();
	//}
	void save(Folder *);
	void remove(Folder *);

	string get_messge_content() const;// { return m_message;}

private:

	string        m_message;	
	set<Folder*>  m_folder;
};

class Folder
{
public:
	Folder(){}
	void addMsg(Messge*);
	void removeMsg(Messge*);
	void show_all_msg();
	//{
	//	for (set<Messge*>::const_iterator beg = m_msg.begin(); beg != m_msg.end(); ++beg)
	//	{
	//		cout << (*beg)->get_messge_content() << endl;
	//	}
	//}
private:
	set<Messge*>  m_msg;
};

void Folder::addMsg(Messge* pMsg)
{
	m_msg.insert(pMsg);
}

void Folder::removeMsg(Messge* pMsg)
{
	m_msg.erase(pMsg);
}

void Folder::show_all_msg()
	{
		for (set<Messge*>::const_iterator beg = m_msg.begin(); beg != m_msg.end(); ++beg)
		{
			cout << (*beg)->get_messge_content() << endl;
		}
	}



Messge::Messge(const Messge &msg): m_message(msg.m_message)
	{
		m_folder = msg.m_folder;
		
		for (set<Folder*>::const_iterator beg = m_folder.begin(); beg != m_folder.end(); ++beg)
		{
			(*beg)->addMsg(this);
		}
	}

Messge::~Messge()
	{
		for (set<Folder*>::const_iterator beg = m_folder.begin(); beg != m_folder.end(); ++beg)
		{
			(*beg)->removeMsg(this);
		}
		m_folder.clear();
	}

string Messge::get_messge_content() const { return m_message;}


void Messge::save(Folder *p)
{
	m_folder.insert(p);
	p->addMsg(this);
}
void Messge::remove(Folder *p)
{
	p->removeMsg(this);
	m_folder.erase(p);
}
Messge& Messge::operator=(const Messge &rhs)
{
	if (&rhs != this)
	{
		for (set<Folder*>::const_iterator beg = m_folder.begin(); beg != m_folder.end(); ++beg)
		{
			(*beg)->removeMsg(this);
		}
		m_message = rhs.m_message;
		m_folder = rhs.m_folder;
		for (set<Folder*>::const_iterator beg = m_folder.begin(); beg != m_folder.end(); ++beg)
		{
			(*beg)->addMsg(this);
		}
	}
	return *this;
}


int main(int argc, char** argv)
{
	Messge name("huang");
	Messge CPP("C++");

	Folder test;
	Folder test1;
	name.save(&test);
	name.save(&test1);
	
	// 会显示 huang C++
	test.show_all_msg();

	return EXIT_SUCCESS;
	
}


0
Timor君
Timor君
写了一下午的代码,居然调试不过
0
Timor君
Timor君
@ johnzhang68 若是不忙,再帮我看看这个代码
0
uian2000
uian2000
不知道为什么,看见问题里有“简单”字样,就不蛋定。 帮顶一下
Timor君
Timor君
为什么我总是写出这么蛋疼的代码
0
uian2000
uian2000
爪机无力,格式不好,见凉 Folder的showAllMessage()遍历过程有问题。 set::const_iterator beg本身已经是指针,所以调用get_msg_content()应为beg->gget_msg_content() (*beg)作用是取引用,之后的调用应为.get_msg… 很久没用++,楼主自己试试,不正确请见凉
0
猫哥-u
猫哥-u

傻孩子,错误提示的很清楚了

cout << (*beg)->get_messge_content() << endl;

->

cout << beg->get_messge_content() << endl;

Timor君
Timor君
真的是这个错误? *beg 是取set元素值,这个值是 Message* 然后 用这个指针来执行 Message 的成员函数。 总体来说就是:(*beg)->get_message_content() . 如果改成 beg->get_message_content()这个根本无法解释嘛 而且同样编译不过
0
johnzhang68
johnzhang68
以下代码可以编译(VS2010)。一个类最好是分成.h 和.cpp文件。声明和宏放在.h 文件里面,定义放在.cpp 文件里。用的时候包含以下即可。
0
johnzhang68
johnzhang68
没有仔细看有没有其他问题。
Timor君
Timor君
谢谢了,原因已经找到,你也给我一个修改这个错误的思路。
返回顶部
顶部