- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
创建自定义 String 类时,我无法为输出重载“<<”运算符。我尝试了几种不同的编写方式(在下面的代码中注释掉,以供引用,因为它们不起作用),但出现了各种错误。对于初学者,我从下面的代码中得到的错误是:
错误 1:错误 C2804:二进制“运算符 <<”第 53 行的参数过多
错误2:error C2333: 'String::operator <<' : 函数声明错误;跳过函数体第 53 行
错误 3:错误 C2679:二进制“<<”:未找到接受类型为“String”的右手操作数(或没有可接受的转换)的运算符第 180 行(有很多)
由于文件超过 300 行,我怀疑你们需要通读一遍,我会 --snip-- 一些,但如果你想要 300 行,我一定会编辑它.
此外,我知道 header 中的“使用命名空间标准”是不好的做法。抱歉,这是我正在使用的旧文件,我保证不会将它包含在未来的头文件中。
也就是说,这是代码(非常感谢您的帮助):
正如我之前所说,非常感谢那些在下方阅读和回复的人。我花了将近两个小时试图找到一个可行的解决方案,而我搜索的帖子要么太复杂以至于我无法理解,要么不适用于我的情况。通过查看 cplusplus 网站,我看到 << 运算符函数只采用一个参数,但是在使它工作时遇到了问题。如果你们发布了您认为可行的内容,我会尝试并回复。
谢谢大家!如果我遗漏了任何重要信息,请告诉我。
#pragma once
#include <iostream>
#include <sstream>
using namespace std;
#define NOT_FOUND -1
//ostream& operator << (ostream& out, const String& myString);
// C++ String class that encapsulates an ASCII C-string
class String
{
public:
// Default constructor
String()
{
Text = NULL;
}
// MUST HAVE: Copy-constructor that performs deep copy
String(const String& source)
{
Text = NULL;
// Call the assignment operator to perform deep copy
*this = source;
}
// Init-constructor to initialize this String with a C-string
String(const char* text)
{
Text = NULL;
// Call the assignment operator to perform deep copy
*this = text;
}
// Init constructor, allocates this String to hold the size characters
String(int size)
{
Text = new char[size];
}
// Destructor
~String()
{
delete[] Text;
}
// This is what I would love to have work.
ostream& operator << (ostream& out, const String& myString)
{
return out << myString.GetText();
}
// Returns a new string that corresponds to a substring of this String
// beginning at startPosition and length chars long;
// if length = 0 (not specified) then the substring spans from
// startPosition until the end of this String
// throws an exception when startPosition is out of bounds
String Substring(int startPosition, int length) const
{
char * str = this->GetText();
String returnString;
int strLength = length;
int x = 0;
if(length == 0)
strLength = GetLength(str)-startPosition;
char* substring = new char[strLength];
// Makes sure the starting position is within the bounds of the String 'this'
try
{
CheckBounds(startPosition, str);
}
catch(char * error)
{
cout << error << endl << endl;
}
// In case the substring length is too long, it cuts short once it reaches the end of the original string. Yu-San, this is #2 on the three options you said I could implement, FYI.
while(x < strLength && str[x+startPosition]!='\0')
{
substring[x] = str[x + startPosition];
x++;
}
substring[x]='\0';
//for(int x = 0; x<strLength; x++)
//{
//returnString = str + startPosition;
returnString = substring;
//}
return returnString;
}
// Assignment operator to perform deep copy
String& operator = (const char* text)
{
// Ddispose of old Text
delete[] Text;
// +1 accounts for NULL-terminator
int trueLength = GetLength(text) + 1;
// Dynamically allocate characters on heap
Text = new char[trueLength];
// Copy all characters from source to Text; +1 accounts for NULL-terminator
for ( int i = 0; i < trueLength; i++ )
Text[i] = text[i];
return *this;
}
// Returns the count of characters in a C-string text; NULL-terminator is not counted
// static means that the member function neither reads nor
// writes any of the class' data members
// String::GetLength("blah");
static int GetLength(const char* text)
{
int x = 0;
while(text[x] != '\0')
x++;
return x;
}
// Returns a reference to a single character from this String
char& operator [] (int index) const
{
int length = GetLength();
// Check for valid index
if ( (index < 0) || (index > length) )
{
stringstream error;
error << "operator[] - index " << index << " is out of bounds (0.." << (length - 1) << ")";
throw String(error.str().c_str());
}
return Text[index];
}
// Returns the count of characters in the String; NULL-terminator is not counted
int GetLength() const
{
return GetLength(Text);
}
char* GetText() const
{
return Text;
}
// Finds first index of a symbol not found in "text" in string *this
int FindFirstNotOf(char * text)
{
String objectString(*this);
int x = 0; // loop counter
int firstIndex = 0; // index to return
while(text[x]!='\0')
{
// runs each character in 'text' against each character in the object.
for(int y = 0; y<objectString.GetLength(); y++)
{
if(objectString[x] == text[x])
objectString[x] = '\0';
}
x++;
}
while(objectString[firstIndex]=='\0' && (firstIndex<objectString.GetLength()))
{
firstIndex++; //keeps running until it Finds a character that wasn't changed to \0
}
if(firstIndex == objectString.GetLength())
firstIndex = -1; // means it wasn't found.
return firstIndex;
}
int FindFirstOf(char iWantThis)
{
String objectString(*this);
int firstIndex = 0; // index to return
while(objectString[firstIndex]!=iWantThis && (firstIndex<objectString.GetLength()))
{
firstIndex++; //keeps running until it Finds a character that wasn't changed to \0
}
if(firstIndex == objectString.GetLength())
firstIndex = -1; // means it wasn't found.
return firstIndex;
}
int FindLastOf(char iWantThis)
{
String objectString(*this);
int index = 0;
int lastIndex = -1;
while(objectString[index]!='\0')
{
if(objectString[index] == iWantThis)
lastIndex = index;
}
return lastIndex;
}
// finds a desired char in String object, with default start index of 0
int Find (char iWantThis, int startIndex = 0)
{
int index = -1;
int ctr = startIndex;
String objectString(*this);
while(objectString[ctr]!='\0' && index == -1) // runs until it reaches end, or the return index is changed
{
if(objectString[ctr] == iWantThis)
index = ctr;
else
ctr++;
}
return index;
}
private:
// Throws an String-type exception when index is out of bounds
void CheckBounds(int index, const char* source) const
{
int size = GetLength(source);
if(index < 0 && index >=size)
throw "Selected Starting Index is Out of Bounds.";
}
// The encapsulated C-string
char* Text;
};
// Stream output operator to print String to output stream
/* ostream& operator << (ostream& out, const String& myString)
* {
* return out << myString.GetText();
* };
*/
最佳答案
您需要插入运算符才能成为自由函数:
在你的类主体中:
class String
{
friend std::stream& operator <<(std::ostream&, const String&);
...
};
在您的类(class)主体之外:
inline std::ostream& operator << (std::ostream& os, const String& myString)
{
os << myString.GetText();
return os;
}
这假设 GetText()
是一个可行的成员函数,在您当前的代码片段中找不到它。我假设你在某个地方有一个。如果是public
,则无需在类体中声明友元关系,只需使用自由函数插入运算符即可。
最后,这假设运算符是在头文件中实现的(因此是内联的)。如果将实现移至 .cpp 文件,请务必在 header 中将其声明为全局原型(prototype)并删除 .cpp 实现中的 inline
序言。
旁注:打破将 using namespace std;
放在头文件中的习惯现在。这是一种不好的做法,可能会对源文件(包括您的 header )产生不需要的命名空间暴露的副作用。
关于c++ - 重载 '<<' 运算符的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15352656/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!