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