创建一个简单的 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*' [重复]

C++常用设计模式

关于如何使用简单的 C++ 库(不使用 .net)和使用该库的 C++ 项目创建 .sln 的基本说明?

设计模式 C++简单工厂模式

设计模式 C++简单工厂模式

c++ 创建类的实例作为引用类型