0

このプログラムを過去 1 時間コンパイルしようとしましたが、成功しませんでした。何が悪いのかわかりませんが、コンストラクターに問題があると思います。ファイル全体を印刷するには長すぎるため、スニペットのみを印刷します。

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();
};

文字列.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

誰かがここで何が間違っているか教えてください。スニペットではなく、プログラム全体を投稿する必要がある場合は、喜んで投稿します。

4

2 に答える 2

1

まず、デフォルトでは、クラス アクセス権限はprivateです。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
//....
};

2番目の問題、あなたが宣言した

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

しかし、あなたの実装は次のとおりです。

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

コメントからの更新:

String.og++ コマンドでリンクする必要があります

g++ -o dist/Debug/GNU-MacOSX/string \
build/Debug/GNU-MacOSX/main.o build/Debug/GNU-MacOSX/String.o
于 2013-07-24T12:13:51.953 に答える
1

「String1.cpp」では、関数を定義しました:

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

それ以外の

istream & operator >>(istream & is, String &st)
于 2013-07-24T12:21:34.627 に答える