在这种特定情况下,如何使用C++正确地重载运算符
How do I properly overload the operator in this specific case using C++
我是C++编程的新手,在实现此运算符重载时遇到了问题。它给出的错误是没有运算符"<<"与这些操作数匹配。
class class1{
public:
bool operator==(class1 &);
friend ostream & operator<<(ostream &, class1 &);
private:
string name;
};
/*Friend ostream & operator <<*/
ostream & operator << (ostream & os, class1 & obj){
os << obj.name;
return os;
}
有人提到我需要另一个重载运算符,但我不知道如何让它与另一个过载运算符
以下是您的代码的情况;类中有一个私有成员字符串变量,没有外部对象可以设置该变量。您的类既不包含已定义的构造函数,也不包含设置方法。当我尝试你的代码时,我不得不更改你的操作员声明和定义:
std::ostream& operator<<( std::ostream& os, class1& obj );
到此:
std::ostream& operator<<( std::ostream& os, const class1& obj );
以便进行编译。然而,在构建项目时,我收到了一个未解析标识符的Linker错误。这里发生的情况是,您声明为类对象的朋友的ostream对象确实知道私有成员字符串,但它无法对其执行任何操作,因为该字符串为空或无效。我把你的课改成了
#include <conio.h>
#include <string>
#include <iostream>
class class1 {
friend std::ostream& operator<<( std::ostream& out, const class1& other );
private:
std::string m_strName;
public:
explicit class1( std::string& strName ) : m_strName( strName ) {}
void setName( std::string& strName ) { m_strName = strName; }
std::string getName() const { return m_strName; }
};
std::ostream& operator << ( std::ostream& out, class1& obj ) {
out << obj.m_strName << std::endl;
// out << obj.getName() << std::endl;
return out;
}
int main() {
class1 a( std::string( "class1" ) );
std::cout << a << std::endl;
std::cout << "Press any key to quit" << std::endl;
_getch();
return 0;
}
这将正确编译、构建、链接和执行,并显示适当的文本,如果没有错误,则以值0退出。我在Win7机器上使用MSV2013。主要问题是,由于类在构造时无法填充其字符串成员,因此ostream运算符对象无法解析正在使用的变量。
过载operator<<(std::ostream&, std::string)
实际上是由#include <string>
定义的。
尽管std::string
也由该标头定义,但如果不包括该标头,则仍然可以定义std::string
,但不能定义此运算符重载。
C++标准要求某些标头提供某些特性,但并不禁止其他标头也提供该特性。在您的情况下,编译器/库编写器已经决定,在另一个标头中实现某些其他功能最容易通过定义std::string
来实现,但它可以通过使用一个单独的文件来定义std::string
来实现,<string>
和其他标头都包含该文件。
如果您希望ostream成为公共成员,请删除它的关键字"friend"。如果你想让ostream成为朋友,请将其移至公众之上:运算符==应该有两个const参数,如果您不想更改,则为const。
friend ostream & operator<<(ostream &, const class1 &);
public:
bool operator==(const class1& x, const class1& y);
或
public:
bool operator==(const class1& x, const class1& y);
ostream & operator<<(ostream &, const class1 &);
使运算符<lt;第二个参数const可能有助于
ostream & operator << (ostream & os, const class1 & obj){
os << obj.name;
return os;
}
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- C++:TypeDef使用元组
- 使用std::multimap迭代器创建std::list
- 从不同线程使用int64的不同字节安全吗
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 为什么在全局范围内使用"extern int a"似乎不行?
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如何使用Google Mock来模拟gettimeofday()
- 如何使用默认参数等选择模板专业化
- 为什么使用 "this" 指针调用派生成员函数?
- 使用新行和不使用新行读取文件
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 如何确定我已使用非编码文件到达 EOF?
- 如何在cuSparse中使用cusparseXcoo2csr从coo转换为csc
- 使用CMake创建QML插件
- 使用 LLVM 的 libc++ 时,__1 符号从何而来?
- 在std::cout之后使用std::cin时,换行符从何而来
- 为什么以及在何处在C++中使用引用和指针
- 基例如何影响使用递归函数的哪些行