[英]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_ptr
, BaseClass
和array
(我使用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.