2013-07-24 29 views
0

我一直在試圖編譯這個程序的最後一個小時沒有成功。 我不知道什麼是錯的,但是,我認爲構造函數有問題。 整個文件太長,無法打印,所以我只打印一個片段。錯誤與動態內存中的字符串C++程序

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 

請有人讓我知道這裏有什麼問題。如果你需要我發佈整個程序,而不是片段,我會很樂意這樣做。

+0

的【什麼是未定義參考/解析的外部符號錯誤可能重複,我如何修復它?](http://stackoverflow.com/questions/12573816/what-is-an-undefined-reference-unresolved-external-symbol-error-and-how-doi-i-fix) – chris

回答

1

首先,默認一個類訪問權限是privateString::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 ++命令

鏈接
+0

@jis沒錯。你的代碼很長,我沒有完全確定它們。 – billz

+0

我將'String :: CINLIM'移動到頭文件的公共部分,但仍然出現錯誤。你知道這是爲什麼嗎? – jis

+0

嗯,現在有什麼錯誤信息?它在我的Linux上乾淨地構建 – billz

1

在「String1.cpp」你定義的函數:

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

,而不是

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

實際上,我可以看到我在cpp文件中有一個拼寫錯誤:std :: istream&operator >>(std :: istream&is,字符串& st);。我已經修復了這個問題,但這並沒有什麼區別 – jis

+0

builds罰款vs2012 – Itsik