创建一个简单的 C++ 字符串类
Posted
技术标签:
【中文标题】创建一个简单的 C++ 字符串类【英文标题】:creating a simple C++ string class 【发布时间】:2015-02-11 20:26:59 【问题描述】:我正在编写一个程序,在其中创建自己的字符串类。该程序应该指示用户写一个句子,复制输入,然后显示它包含多少个字符。
虽然它确实构建和编译(使用 Visual Studio Express 2013),但它会复制指示用户写下的句子,不显示字符数量,然后崩溃。
我猜这与如何动态分配内存或如何在函数之间传递 *character 和 _String 有关。但是有关如何解决此问题或改进我的代码的一些帮助将非常有帮助。
标题:字符串.h
class String
private:
char *characters[50]; // 50 is just a placeholder to get it to work
int size;
public:
// Constructors and Destructors
String();
String(char*);
~String();
// Other functions
void stringAssign(char*);
void printString(char*);
int stringSize(char*) const;
;
实现:String.ccp
#include "String.h"
#include <iostream>
#include <cstring>
String::String()
size = 0;
* characters = 0;
String::String(char* _String)
size = stringSize(*characters + 1);
_String = new char[size];
String::~String()
delete [] *characters;
void String::stringAssign(char* _String)
_String = characters[size];
void String::printString(char* _String)
for (int i = 0; _String[i] != '\0'; i++)
std::cout << _String[i];
int String::stringSize(char* _String) const
int size;
size = strlen(*characters);
return size;
测试:Main.ccp
#include "String.h"
#include <iostream>
int main()
char string[50];
String s;
std::cout << "Enter a sentence that is less than 50 characters\n\n";
std::cin.getline(string, 50);
s.printString(string);
std::cout << s.stringSize(string);
return 0;
已解决:
我让程序运行起来了。从字面上看,我所做的只是在实现中用_String
替换了两个*character
参数。我知道它与函数传递有关,并且我确实得到了一些帮助。但是一个人没有提供任何有用的意见(实际上是在侮辱我),两人都说“有太多事情要解决”。对我必须解决的“这么多事情”进行一些详细说明会很好。
【问题讨论】:
I have a dream! 您是否尝试先阅读一些有关 C++ 的内容?由于某些原因,尝试通过实验来学习是一种糟糕的想法…… 我认为您可能需要先从基础开始,找到一本好的 C++ 教程、书籍或课程。 “你有没有尝试先阅读一些关于 C++ 的内容?这是一种通过实验来学习的语言是一个糟糕的想法,原因有几个…… – 6502”——确实,很不幸因为它正在成为一种你无法再推理的语言。如果可以的话,复制和改编惯用示例可能更容易,而不是尝试编写自己的代码。 【参考方案1】:在几乎所有函数中,您都使用 函数的参数 _String
,而不是使用应该在内部保存字符串的成员字段 characters
。所以你的函数根本不改变字符串,而是试图弄乱你传递给它们的东西。
一个例子
struct Foo
char internal[42];
void bar(char *external) external[0] = 'X';
void qux(char *external) internal[0] = 'Z';
;
int main()
Foo foo;
char something[6] = "Hello";
foo.qux(something); // Did something to the member variable foo.internal; variable something is unchanged.
foo.bar(something); // Now something reads "Xello", foo.internal was not changed.
您的代码几乎与函数 bar
一样,但它应该像 qux
一样工作。
这段代码确实有太多需要修复的地方。
以防万一您弄错了...与其他一些语言(例如 Python 或 Smalltalk)不同,C++ 通过 this
隐式 传递指向当前对象的指针。
【讨论】:
以上是关于创建一个简单的 C++ 字符串类的主要内容,如果未能解决你的问题,请参考以下文章
带有构造函数的简单类引发警告:ISO C++ 禁止将字符串常量转换为 'char*' [重复]