试着创建我自己的字符串类

时间:2012-02-17 04:32:22

标签: c++ class compilation g++

这些是我的程序错误。

myString1.cpp: In constructor ‘MyString1::MyString1(char*, int)’:
myString1.cpp:6: error: expected primary-expression before ‘]’ token
myString1.cpp:6: error: expected primary-expression before ‘]’ token
myString1.cpp: In member function ‘MyString1 MyString1::append(MyString1)’: 
myString1.cpp:11: error: invalid use of member (did you forget the ‘&’ ?) 
myString1.cpp: In member function ‘void MyString1::clear()’:
myString1.cpp:25: error: expected primary-expression before ‘]’ token 
myString1.cpp:25: error: expected primary-expression before ‘{’ token
myString1.cpp:25: error: expected `;' before ‘{’ token 
myString1.cpp: In member function ‘bool MyString1::empty()’:
myString1.cpp:29: error: expected primary-expression before ‘]’ token
myString1.cpp:31: error: expected primary-expression before ‘else’ 
myString1.cpp:31: error: expected `;'  before ‘else’

以下是我在三个不同部分的计划。

myString1.h

#ifndef MYSTRING1_H
#define MYSTRING1_H

class MyString1
{
  private:
   char chars[];
   int size;
  public:
   MyString1();
   MyString1(char chars[], int size);
   MyString1 append(MyString1 s);
   char at(int index);
   int length();
   void clear();
   bool empty();
   int find(char ch);
};
#endif

myString1.cpp

#include "myString1.h"
using namespace std;

MyString1::MyString1(char chars[], int size)
{
  this->chars[] = chars[];
  this->size = size;
}
MyString1 MyString1::append(MyString1 s)
{
  for(int i = size; i > size - s.length; i++)
    chars[i] = s.at(i);
}
char MyString1::at(int index)
{
  return chars[index];
}
int MyString1::length()
{
  return size;
}
void MyString1::clear()
{
  size = 0;
  chars[] = {};
}
bool MyString1::empty()
{
  if(chars[]){
    return true;
    else
      return false;
  }
}
int MyString1::find(char ch)
{
  for(int i = 0; i < size; i++)
    if(chars[i] = ch)
      return i;
}

testMyString1.cpp

#include <iostream>
#include "myString1.h"
using namespace std;

int main()
{
  MyString1 first("cat", 4);
  MyString1 second("dog", 4);
  cout << first.at(1) << " and " << second.at(1) << endl;
  first.append(second);
  cout << first.at(6) << endl;

  return 0;
}

我是一个新手,只是想学习如何使用g ++编译器,所以只是寻找帮助阅读错误消息和调试我的代码。此外,我确信有一些非常糟糕的代码,所以任何帮助都表示赞赏。

1 个答案:

答案 0 :(得分:4)

代码有很多错误,所以我不知道从哪里开始,但我想通常会给你一些指导来帮助你理解你的代码是好的。

在我看来,你不需要在String类中有一个大小索引,因为strlen()函数很乐意为你计算它。 现在为您的类声明检查如何声明将为您保存字符串的指针。你需要这样做:

class MyString1
{
  private:
   char* chars;//this declares a pointer to a char that will hold the string for you
  public:
  ...

此外,您永远不会分配包含字符串的char *。你的构造函数应该是:

MyString1::MyString1(const char* chars)
{
  this->chars = (char*) malloc(strlen(chars)+1); //this will allocate an array of strlen() chars +1
  strcpy(this->chars,chars);
}

正如您所看到的,我没有使用大小索引,因为strlen可以非常有效地为您找到它。 +1代表'\ 0',表示字符串的结尾。

现在要在字符串上添加一些东西,这会很棘手。

void MyString1::append(const MyString1& s) //it's good to give a constant reference to the string here
{
  //first of all we gotta reallocate the pointer,since we don't have enough memory for the string
  int newsize = strlen(this->chars) + strlen(s)+1;
  this->chars = (char*) realloc(this->chars,newSize); \\ no check for realloc failure, I know but this is just an example

  strcat(this->chars,s.chars);

}

附加时不需要返回任何内容。你正在为这个字符串做些什么。

你的:: at()函数几乎没问题。想象一下,如果字符串的大小是10并且你请求MyString1 :: at(12)会发生什么。这可能会导致分段错误(这不好)。

因此,您应该更改代码以执行如下所示的边界检查:

char MyString1::at(int index)
{
  //if it's out of bounds let's return -1 which will signify that we got an out of bounds value  (could also throw an exception here but that's a different subject altogether)
  if(index > strlen(this->chars) || index <0)
      return -1;

  return chars[index];
}

同样在C / C ++中,你必须释放你分配的内存。所以为了做到这一点,你应该声明一个叫做析构函数

的东西
MyString1::~MyString1()
{
  free(this->chars);
}

最后是空函数就可以这样:

bool MyString1::empty()
{
  return (this->chars[0] == '\0';
}