如何使用带有指针对象数组的重载ostream运算符?

时间:2018-04-29 14:32:10

标签: c++

在下面的代码中,我怎样才能使用重载的"<<"运营商为了打印所需的信息?

或者确切地说,这里的错误在哪里?

重载<<其中一个继承类中的运算符:

friend ostream &operator<<(ostream &os, DigitSecret &s){
        for(int i=0;i<s.n;i++)
            os<<s.digits[i];

        return os<<" Simple entropy: "<<s.simpleEntropy()<<" Total: "<<s.total();
}


void printAll (Secret ** secrets, int n) {
    for(int i=0;i<n;i++){
        cout<<secret[i] //This is printing an address, however that is not what i want.
        secrets[i]->print(); //I want that to work like this.

    }
}

整个代码:https://pastebin.com/MDCsqUxJ 我希望第134和143行正常工作。

编辑:

3 个答案:

答案 0 :(得分:1)

secret[i]的类型为Secret*,您应首先进行解除,然后选择重载:

 cout << *secret[i];

附注:使用std::vector代替原始动态分配。

答案 1 :(得分:0)

请参阅此代码段:

class base {
public:
    virtual void print() = 0;
    virtual std::ostringstream get_value() const = 0;
    int get_id() const { return id_; }
protected:
    int id_;
};

class A:public base {
public:
    A(std::string val):val_(val){ id_ = 1; }
 void print() override { std::cout << " I am A" << std::endl;  }
 std::ostringstream get_value() const { std::ostringstream ss; ss << val_; return ss; }
private:
    std::string val_;
};

class B :public base {
public:
    B(int val):val_(val) { id_ = 2; }
    void print() override { std::cout << " I am B" << std::endl; }
    virtual std::ostringstream get_value() const { std::ostringstream ss; ss << val_; return ss; }
private:
    int val_;
};

std::ostream& operator << (std::ostream& os, const base* p)
{
    std::string str;
    if (p->get_id() == 1) {
        str = ((A*)(p))->get_value().str();
        os << "A " << str << "\n";
    }
    else
        if (p->get_id() == 2) {
            str = ((B*)(p))->get_value().str();
            os << "B " << str << "\n";
        }
    return os;
}

void PrintAll(base** a)
{
    for (int i = 0; i<2; i++)
        std::cout << a[i];
}

int main()
{
    base* a[2];
    a[0] = new A("Hello");
    a[1] = new B(10);
    PrintAll(a);

    return 0;
}

输出:

enter image description here

答案 2 :(得分:0)

我这样解决了:

void printAll (Secret ** secrets, int n) {
    for(int i=0;i<n;i++){

        DigitSecret* ds = NULL;
        CharSecret* cs = NULL;
       ds = dynamic_cast<DigitSecret*>(secrets[i]);
       cs = dynamic_cast<CharSecret*>(secrets[i]);  

        if(ds!=NULL)
            cout<<*ds<<endl;
        else
            cout<<*cs<<endl;
       // secrets[i]->print();

    }
}

基本上在这种情况下,我必须使用带有来自派生类的新指针的dynamic_cast,来自数组的每个指针,并检查指针是否为!= NULL,然后在解除引用的新指针上使用重载运算符。