gpt4 book ai didi

c++ - 调用子插入运算符

转载 作者:行者123 更新时间:2023-11-28 03:40:46 25 4
gpt4 key购买 nike

我有这样的代码:

主要.cpp

     #include <iostream>
#include "MySmartPtr.h"
#include "Bean.h"
using namespace std;
int main(int argc,char* argv[])
{
MySmartPointer<Bean> ptr = new Bean;
ptr->setName("Jordan Borisov");
cout << ptr << endl;
return 0;
}

MySmartPtr.h

     #ifndef MY_SMART_POINTER_H
#define MY_SMART_POINTER_H
#include <iostream>
using namespace std;
template<typename T>
ostream& operator<<(ostream& os,T& o);

template<typename T>
class MySmartPointer
{
public:
MySmartPointer()
{
ptr = new T;
isOwner = true;
};
MySmartPointer(T* t)
:ptr(t)
{
}
~MySmartPointer()
{
if (isOwner) delete ptr;
}
const T* getPtr() const {return ptr;}
T& operator* () {return *ptr;}
T* operator->() {return ptr;}


private:
mutable bool isOwner;
T* ptr;
};
template<typename T>
ostream& operator<<(ostream& os,T& o)
{
os << static_cast<const T>(o);
return os;
};
#endif

Bean.h

     #ifndef BEAN_H
#define BEAN_H
#include <string>
#include <iostream>
using namespace std;
class Bean
{
public:
Bean();
void setName(const string& name);
const string& getName() const;
private:
string name;
};
#endif

Bean.cpp

     #include "Bean.h"
Bean::Bean()
:name("")
{
}
const string& Bean::getName() const
{
return name;
}
void Bean::setName(const string& name)
{
this->name = name;
}
ostream& operator<<(ostream& os,Bean& o)
{
os << "Name :" << o.getName();
return os;
}

所以这里的问题是在 Microsoft visual studio 2008 中我有这个警告:

warning C4717: 'operator<< const >' : recursive on all control paths, function will cause runtime stack overflow

当然,当我在 main.cpp 文件的 cout 行对程序进行 debig 时,我按 F11,然后调试器转到被覆盖的运算符函数中的 MySmartPtr.h 文件。并在 os << static_cast<const T>(o); 行中一次又一次地调用这个运算符重载,所以我得到了堆栈重载异常。我的问题是为什么会这样?

操作系统 - Windows XP

提前致谢。

最佳答案

why this is happening?

恕我直言,它正在发生,因为这是您编写的代码。

template<typename T>
ostream& operator<<(ostream& os,T& o)
{
os << static_cast<const T>(o);
return os;
};

您为 operator<< 编写了一个递归函数模板,适用于所有可能的类型。它必须调用自己。试试这个:

 template<typename T>
std::ostream& operator<<(std::ostream& os,const MySmartPointer<T>& o);

你的 operator<<因此仅限于从您自己的模板实例化的类型创建的对象,而不是系统中的每个对象

在其他新闻中,你还有using namespace std在你的标题中,未能声明 Beanoperator<< .

这是您程序的更正版本:

Bean.cpp

 #include "Bean.h"
Bean::Bean()
:name("")
{
}
const std::string& Bean::getName() const
{
return name;
}
void Bean::setName(const std::string& name)
{
this->name = name;
}
std::ostream& operator<<(std::ostream& os,const Bean& o)
{
os << "Name :" << o.getName();
return os;
}

主要.cpp

 #include <iostream>
#include "MySmartPtr.h"
#include "Bean.h"
using namespace std;
int main(int argc,char* argv[])
{
MySmartPointer<Bean> ptr = new Bean;
ptr->setName("Jordan Borisov");
cout << ptr << endl;
return 0;
}

Bean.h

 #ifndef BEAN_H
#define BEAN_H
#include <string>
#include <iostream>
class Bean
{
public:
Bean();
void setName(const std::string& name);
const std::string& getName() const;
private:
std::string name;
};
std::ostream& operator<<(std::ostream&, const Bean&);
#endif

MySmartPtr.h

 #ifndef MY_SMART_POINTER_H
#define MY_SMART_POINTER_H
#include <iostream>

template<typename T>
class MySmartPointer
{
public:
MySmartPointer()
{
ptr = new T;
isOwner = true;
};
MySmartPointer(T* t)
:ptr(t)
{
}
~MySmartPointer()
{
if (isOwner) delete ptr;
}
T* getPtr() {return ptr;}
T& operator* () {return *ptr;}
T* operator->() {return ptr;}
const T* getPtr() const {return ptr;}
const T& operator* () const {return *ptr;}
const T* operator->() const {return ptr;}

private:
mutable bool isOwner;
T* ptr;
};
template<typename T>
std::ostream& operator<<(std::ostream& os,const MySmartPointer<T>& o)
{
os << *o;
return os;
}
#endif

关于c++ - 调用子插入运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9329814/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com