簡體   English   中英

輸出cout是感嘆號。 C ++

[英]Output cout is exclamation mark. C++

有人告訴我將頭文件寫入包含以下內容的main.cpp

OOP::array tab;

  for(int i = 0; i < rand()%10 + 1; ++i)
  {
    tab.push_back(new BaseClass("BaseClass 1"));
    tab.push_back(new BaseClass("BaseClass 2"));
    tab.push_back(new BaseClass("BaseClass 3"));
  }

  OOP::print_tab_el(tab); //prints tab using operator<< for its elements.

類數組是智能指針的容器。 所以我實現了counted_ptrBaseClassarray (我使用std::vector作為容器)類,但是當我調用“ print_tab_el(tab) ”函數時,我得到了感嘆號!

似乎矢量的所有智能指針項都包含“!” 作為名字。 我從來沒有把“!” 那里。

這是我的標題。

namespace OOP {

    class BaseClass
        {
            public:
                std::string name;

                BaseClass(std::string arg) {name=arg;}

                friend std::ostream & operator<<(std::ostream &os, const BaseClass& ref)
                    {
                        os<<ref.name<<"\n"; //gives ! ???
                        return os;
                    }

        };



    class array
        {
            public:
                std::vector <counted_ptr<OOP::BaseClass> > myvec;

                void push_back( OOP::BaseClass *arg)
                    {
                       counted_ptr< OOP::BaseClass> tmp(arg);
                       myvec.push_back(tmp);

                    }

        };



    void print_tab_el(array arr)
         {

            std::vector <counted_ptr<OOP::BaseClass> >::iterator it;

            for (it=arr.myvec.begin();it!=arr.myvec.end();++it){
                 std::cout<<**it;
                }

         }

};

這是程序輸出:

!
!
!
!
!
!
!
!
and some more.

添加:

counted_ptr.cpp

#ifndef COUNTED_PTR_CPP
#define COUNTED_PTR_CPP

#include "counted_ptr.h"
#include <iostream>

/****************************************************************************/
template <class T>
counted_ptr<T>::counted_ptr(T* pointer):ptr(pointer)
    {
        refs.addRef();
    }
/****************************************************************************/

template <class T>
counted_ptr<T>::counted_ptr(const counted_ptr& ref):ptr(ref.ptr), refs(ref.refs+1) {}
/****************************************************************************/

template <class T>
counted_ptr<T>::~counted_ptr()
    {
        if (refs.takeRef()==0)
            delete ptr;
    }
/****************************************************************************/

template <class T>
T* counted_ptr<T>::operator->(){
    return ptr;
}
/****************************************************************************/

template <class T>
T& counted_ptr<T>::operator*(){
    return *ptr;
}
/****************************************************************************/

template <class T>
counted_ptr<T>& counted_ptr<T>::operator=(const counted_ptr<T>& rcpt_r){

    if (this!=&rcpt_r)
        {
            if (refs.takeRef()==0)
                delete ptr;

            ptr=rcpt_r.ptr;
            //refs=rcpt_r.refs+1;   
            refs=rcpt_r.refs;
            refs.addRef();      

        }

    return *this;
}
/****************************************************************************/
#endif

counted_ptr.h

#ifndef COUNTED_PTR_H
#define COUNTED_PTR_H

#include "reference.h"
template <class T>
class counted_ptr{

public:
    counted_ptr( T* pointer);
    counted_ptr(const counted_ptr& ref);
    ~counted_ptr();

    T* operator->();
    T& operator*();
    counted_ptr& operator=(const counted_ptr<T>& ref);


private:
    T *ptr;
    reference refs;

};

class testclass{};
#endif

#include "counted_ptr.cpp"

reference.cpp

#include "reference.h"
#include <iostream>

/****************************************************************************/
reference::reference():nr_of_references(0){}
/****************************************************************************/

reference::reference(const int value):nr_of_references(value){}

reference& reference::operator=(const int& ref)
    {
        nr_of_references=ref;
        return *this;
    }
/****************************************************************************/

reference::operator int()const
    {
        return nr_of_references;
    }
/****************************************************************************/

int reference::addRef()
    {
        return ++nr_of_references;
    }
/****************************************************************************/

int reference::takeRef()
    {
        return --nr_of_references;
    }
/****************************************************************************/

參考文件

class reference{
    public:
        reference();
        reference(const int value);
        //reference& operator=(const reference& ref);
        reference& operator=(const int& ref);
        operator int()const;

        int addRef();
        int takeRef();

    private:
        int nr_of_references;

};

每個counted_ptr實例都有其自己的reference實例。 每個reference實例都有其自己的nr_of_references實例。 盡管每個counter_ptr正確管理了reference ,但問題是,只有計數為1的counted_ptr超出范圍時,即使將其復制到另一個counted_ptr實例之后,它也會破壞該指針。

您的counted_ptr需要重新設計,以便同一對象的所有counted_ptr都可以操縱相同的reference

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM