Попытка сделать свой собственный класс строки - PullRequest
1 голос
/ 17 февраля 2012

Это ошибки, которые я получаю для своей программы.

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 Ответ

4 голосов
/ 17 февраля 2012

В коде много ошибок, поэтому я не знаю, с чего начать, но я полагаю, что в общем случае дать вам несколько советов, которые помогут вам понять ваш код, будет в порядке.

По моему мнению, вам не нужно иметь индекс размера в классе String, так как есть функция strlen (), которая с радостью вычислит его для вас. Теперь для объявления вашего класса проверьте, как вы объявляете указатель, который будет содержать строку для вас. Вам нужно сделать это, как показано ниже:

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

Также вы никогда не выделяете символ *, содержащий строки. Ваш конструктор должен быть:

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';
}
...