如何在C ++中修复'无效的操作数到二进制表达式'错误

时间:2019-03-28 14:42:57

标签: c++ xcode

我正在尝试制作一个程序,该程序将所有对象的名称都从另一个对象中保存到一个对象中,例如,我有一个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')

谢谢!

2 个答案:

答案 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>;