动态内存c ++程序中的字符串错误

时间:2013-07-24 12:07:41

标签: c++ string constructor dynamic-memory-allocation

我一直试图在最后一小时编译这个程序但没有成功。 我无法弄清楚出了什么问题,但是,我认为构造函数存在问题。  整个文件太长,无法打印,所以我只打印一个片段。

String1.h

#ifndef STRING1_H
#define STRING1_H
#include <iostream>
using std::ostream;
using std::istream;


class String {
    char *str;
    int len;
    static int num_strings;
    static const int CINLIM = 80;
public:

String(const char *s);
String();
String(const String &); //COPY CONSTRUCTOR: PASS-BY-REF ALWAYS
 ~String();
 int length() const {
    return len;
}
 String & operator=(const String &);
String & operator=(const char* );
 char & operator [](int i);
const char & operator [](int i) const;
friend std::istream &operator>>(std::istream & is, String & st);
friend std::ostream &operator<<(std::ostream & os, const String & st);
 static int HowMany();
};

String.cpp

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


int String::num_strings = 0;

int String::HowMany() {
    return num_strings;
}


String::String(const char* s) {
    len = std::strlen(s);
    str = new char [len + 1];
    std::strcpy(str, s);
    num_strings++;
} 


String::String() {
    len = 4;
    str = new char[1];
   std::strcpy(str, "C++");
    str[0] = '\0';
    num_strings++;
}


String::String(const String & st) {
    num_strings++;
    len = st.len;
    str = new char[len + 1];
    std::strcpy(str, st.str);

}

String::~String() {

    --num_strings;
    delete [] str;
}

String & String::operator =(const String& st) {
    if (this == &st)
        return *this;
    delete [] str;
    len = st.len;
    str = new char [len + 1];
    std::strcpy(str, st.str);
    return *this;
}


String &String::operator=(const char* s) {
    delete[]str;
    len = std::strlen(s);
    str = new char [len + 1];
    std::strcpy(str, s);
    return *this;
} 


char & String::operator [](int i) {
    return str[i];
}

const char & String::operator [](int i) const {
    return str[i];
}


ostream & operator <<(ostream& os, const String& st) {

    os << st.str;
    return os;
}

istream & operator >>(iostream & is, String &st) {
    char temp[String::CINLIM];
    is.get(temp,String::CINLIM);
    if(is)
        st=temp;
    while(is&&is.get()!='\n')
        continue;
    return is;
}

的main.cpp

#include <iostream>

#include "String1.h"
using namespace std;

const int ArSize = 10;
const int MaxLen = 81;

int main() {
    String name;
   cout << "Hi what is your name?\n";
   cin >> name;
   cout << "Please enter up to " << ArSize <<
            "sayings <empty line to quit>:\n";

   String sayings[ArSize];
 char temp [MaxLen];
    int i;

    for (i = 0; i < ArSize; i++){
        cout << i + 1 << ":";
    cin.get(temp, MaxLen);

    while (cin && cin.get() != '\n')
        continue;
    if (!cin || temp[0] == '\0')
        break;
    else
        sayings[i] = temp;
  }
    int total = i;
}

我收到的错误消息是:

    /usr/bin/make"  -f nbproject/Makefile-Debug.mk dist/Debug/GNU-MacOSX/string
mkdir -p build/Debug/GNU-MacOSX
rm -f build/Debug/GNU-MacOSX/main.o.d
g++    -c -g -MMD -MP -MF build/Debug/GNU-MacOSX/main.o.d -o build/Debug/GNU-MacOSX/main.o main.cpp
mkdir -p dist/Debug/GNU-MacOSX
g++     -o dist/Debug/GNU-MacOSX/string build/Debug/GNU-MacOSX/main.o  
Undefined symbols for architecture x86_64:
  "String::String()", referenced from:
      _main in main.o 
  "operator>>(std::basic_istream<char, std::char_traits<char> >&, String&)", referenced from:
      _main in main.o
  "String::~String()", referenced from:
      _main in main.o
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
make[2]: *** [dist/Debug/GNU-MacOSX/string] Error 1
make[1]: *** [.build-conf] Error 2
make: *** [.build-impl] Error 2

请有人告诉我这里有什么问题。如果你需要我发布整个程序,而不是片段,我会很乐意这样做。

2 个答案:

答案 0 :(得分:1)

首先,默认情况下,类访问权限为私有String::CINLIM是私有的,您无法直接访问它。您需要授予对CINLIM的公共访问权限或将其移出String类。

char temp[String::CINLIM];   // Error, String::CINLIM is private
is.get(temp,String::CINLIM); // same Error

class String {
    char *str;
    int len;
    static int num_strings;
public:
    static const int CINLIM = 80;  // make CINLIM public. 
                                   // Now you can access String::CINLIM directly
//....
};

第二个问题,你宣布了

std::istream &operator>>(std::istream & is, String & st);
//                            ^^^^^^^^

但您的实施是:

operator >>(iostream & is, String &st)
//          ^^^^^^^^

评论更新:

您需要在g ++命令

中链接String.o
g++ -o dist/Debug/GNU-MacOSX/string \
build/Debug/GNU-MacOSX/main.o build/Debug/GNU-MacOSX/String.o

答案 1 :(得分:1)

在'String1.cpp'中定义了函数:

istream & operator >>(iostream & is, String &st)

而不是

istream & operator >>(istream & is, String &st)