我正在尝试制作一个程序,该程序将所有对象的名称都从另一个对象中保存到一个对象中,例如,我有一个class Cheltuieli
来保存一个字符,而我有一个class Repo
来保存一个数组,其中Cheltuieli
我尝试将cout << *c;
更改为cout << *c->getName();
,但我只收到1个字母: p 而不是 [“ pizza”,“ pizza”]
Mancare.hpp
#ifndef Mancare_hpp
#define Mancare_hpp
class Cheltuieli{
private:
char* name;
public:
Cheltuieli();
Cheltuieli(char* n);
~Cheltuieli();
void setName(char* n);
char* getName();
};
#endif
Mancare.cpp
#include "Mancare.hpp"
#include <string.h>
Cheltuieli::Cheltuieli()
{
this -> name = NULL;
}
Cheltuieli::Cheltuieli(char* n)
{
this -> name = new char[strlen(n) + 1];
strcpy(this -> name, n);
}
Cheltuieli::~Cheltuieli()
{
if(this -> name != NULL)
{
delete[] this -> name;
this -> name = NULL;
}
}
void Cheltuieli::setName(char *n)
{
if(this -> name)
delete[] this -> name;
this -> name = new char[strlen(n) + 1];
strcpy(this -> name, n);
}
char *Cheltuieli::getName()
{
return this -> name;
}
void Repo::addElement(Cheltuieli &c)
{
this -> cheltuieli[this -> size] = c;
this -> size++;
}
Cheltuieli* Repo::getAll()
{
return this -> cheltuieli;
}
char* const ps = "pizza";
Cheltuieli a = Cheltuieli(ps);
Repo n = Repo();
n.addElement(a);
n.addElement(a);
Cheltuieli* c = n.getAll();
cout << *c;
我得到输出: 0x100503b38 ,错误为对二进制表达式无效的操作数('std :: __ 1 :: ostream'(又名'basic_ostream')和'Cheltuieli')
谢谢!
答案 0 :(得分:0)
尝试在Cheltuieli中重载<<运算符:
friend ostream& operator<<(ostream& os, const Cheltuieli& x)
{
os << x.name;
return os;
}
答案 1 :(得分:0)
据我所知,staying_alive
类正在实现Cheltuieli
类中已经完成的工作的很小一部分-但是它是不完整的,所以如果您这样做:
std::string
由于默认的复制构造函数, Cheltuieli orig("something");
Cheltuieli cpy = orig;
和orig
都将有一个cpy
成员指向同一地址。了解有关The rule of three/five/zero的信息。
类似地,name
类似乎正在实现接近Repo
的东西。我建议您不要开始摆弄原始指针,而要使用标准类。您甚至可以为它们创建别名:
std::vector
像这样使用:
using Cheltuieli = std::string;
using Repo = std::vector<Cheltuieli>;