Форум программистов, компьютерный форум CyberForum.ru

Запутался в ссылках - C++

Восстановить пароль Регистрация
 
No10
 Аватар для No10
30 / 28 / 2
Регистрация: 03.06.2010
Сообщений: 465
18.06.2012, 09:51     Запутался в ссылках #1
Долго сижу и никак не могу понять в чём ошибка. Вот 3 файла. Они подключены правильно и работают.
main.cpp

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include <iostream>
#include <iomanip>
#include <windows.h>
#include <math.h>
#include "string2.h"
 
using namespace std;
 
char bufRus2[256];
char* Rus2(const char* text) {
      CharToOem(text, bufRus2);
      return bufRus2;
}
 
int main()
{
    String s1("Pozdravlyaem"), s2(" s dnem rozdenia"), s3("");
    cout << Rus2("s1 равно: \"") << s1 << "\"" << endl;
    cout << Rus2("s2 равно: \"") << s2 << "\"" << endl;
    cout << Rus2("s3 равно: \"") << s3 << "\"" << endl;
    cout << Rus2("Результат сравнения s2 и s1: ") << endl;
    cout << Rus2("s2 == s1 даёт результат: ") << (s2 == s1) << endl;
    cout << Rus2("s2 != s1 даёт результат: ") << (s2 != s1) << endl;
    cout << Rus2("s2 < s1 даёт результат: ") << (s2 < s1) << endl;
    cout << Rus2("s2 > s1 даёт результат: ") << (s2 > s1) << endl;
    cout << Rus2("s2 <= s1 даёт результат: ") << (s2 <= s1) << endl;
    cout << Rus2("s2 >= s1 даёт результат: ") << (s2 >= s1) << endl << endl;
 
    cout << Rus2("Проверка !s3:") << endl;
    if (!s3) {
        cout << Rus2("s3 пустая; присваивание s1 строке s3;") << endl;
        s3 = s1;
    }
 
    cout << Rus2("s1 += s2 даёт результат s1: ");
    s1 += s2;
    cout << s1 << endl << endl;
 
    cout << Rus2("s1 равно: \"") << s1 << "\"" << endl;
    cout << Rus2("s2 равно: \"") << s2 << "\"" << endl;
    cout << Rus2("s3 равно: \"") << s3 << "\"" << endl;
 
    cout << Rus2("s1 += \" vas \" даёт результат:") << endl;
    s1 += " vas ";
    cout << "s1 = " << s1 << endl << endl;
 
    cout << Rus2("Подстройка s1 начиная с ") << endl;
    cout << Rus2("нуля до 27, s1(0, 27), равно: ") << s1(0, 27) << endl << endl;
 
    cout << Rus2("Подстройка s1 начиная c ") << endl;
    cout << Rus2("28, s1(28, 0) равно: ") << s1(28, 0) << endl << endl;
 
    String *s4Ptr = new String (s1);
    cout << " *s4Ptr = " << *s4Ptr << endl;
 
    delete s4Ptr;
 
    s1[0] = 'P';
    s1[14] = 'D';
    cout << endl;
    cout << "s1 после s1[0] = 'P' и s1[14] = 'D' даёт результат: "
         << s1 << endl << endl;
 
    cout << Rus2("Попытка присвоить 'D' эелементу s1[50] даёт результат: ") << endl;
    s1[50] = 'D';
 
    system("pause");
    return 0;
}

string2.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#ifndef STRING2_H
#define STRING2_H
 
#include <iostream>
 
using namespace std;
 
class String {
        friend ostream &operator<< (ostream &, const String &);
        friend istream &operator>> (istream &, String &);
    public:
        String(const char * = "");
        String(const String &);
        ~String();
        const String &operator=(const String &);
        String &operator+=(const String &); // сцепление или конкатенация
        int operator!() const;
        int operator== (const String &) const;
        int operator!= (const String &) const;
        int operator< (const String &) const;
        int operator> (const String &) const;
        int operator<= (const String &) const;
        int operator>= (const String &) const;
        char &operator[](int);
        String operator()(int, int);
        int getLenght() const;
 
    private:
        char *sPtr;
        int lenght;
 
};
 
#endif // STRING2_H
string2.cpp

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#include <iostream>
#include <iomanip>
#include <string.h>
#include <assert.h>
#include <windows.h>
#include <math.h>
#include "string2.h"
 
using namespace std;
 
char bufRus[256];
char* Rus(const char* text) {
      CharToOem(text, bufRus);
      return bufRus;
      }
 
String::String(const char *s)
{
    cout << Rus("Конструктор преобразования: ") << s << endl;
    lenght = strlen(s);
    sPtr = new char[lenght + 1];
    assert(sPtr != 0);
    strcpy(sPtr, s);
}
 
String::~String()
{
    cout << Rus("Деструктор: ") << sPtr << endl;
    delete [] sPtr;
}
 
const String &String::operator=(const String &right)
{
    cout << Rus("Вызов operator=") << endl;
 
    if (&right != this) {
        delete [] sPtr;
        lenght = right.lenght;
        sPtr = new char[lenght + 1];
        assert(sPtr != 0);
        strcpy(sPtr, right.sPtr);
    }
    else { cout << Rus("Попытка самоприсваивания String.") << endl; }
 
    return *this;
}
 
String &String::operator+=(const String &right)
{
    char *tempPtr = sPtr;
    lenght += right.lenght;
    sPtr = new char[lenght + 1];
    assert(sPtr != 0);
    strcpy(sPtr, tempPtr);
    strcat(sPtr, right.sPtr);
    delete [] tempPtr;
 
    return *this;
}
 
int String::operator!() const { return lenght == 0;}
 
int String::operator== (const String &right) const
{
    return strcmp(sPtr, right.sPtr) == 0;
}
 
int String::operator!= (const String &right) const
{
    return strcmp(sPtr, right.sPtr) != 0;
}
 
int String::operator< (const String &right) const
{
    return strcmp(sPtr, right.sPtr) < 0;
}
 
int String::operator> (const String &right) const
{
    return strcmp(sPtr, right.sPtr) > 0;
}
 
int String::operator<= (const String &right) const
{
    return strcmp(sPtr, right.sPtr) <= 0;
}
 
int String::operator>= (const String &right) const
{
    return strcmp(sPtr, right.sPtr) >= 0;
}
 
char &String::operator[] (int subscript)
{
    assert(subscript >= 0 && subscript < lenght);
    return sPtr[subscript];
}
 
String String::operator() (int index, int subLenght)
{
    assert(index >= 0 && index < lenght && subLenght >= 0);
    String sub;
 
    if ((subLenght == 0) || (index + subLenght > lenght))
        sub.lenght = lenght - index + 1;
    else
        sub.lenght = subLenght + 1;
 
    delete sub.sPtr;
    sub.sPtr = new char [sub.lenght];
    assert(sub.sPtr != 0);
 
    strncpy(sub.sPtr, &sPtr[index], sub.lenght);
    sub.sPtr[sub.lenght] = '\0';
 
    return sub;
}
 
int String::getLenght() const { return lenght; }
 
ostream &operator<< (ostream &output, const String &s)
{
    output << s.sPtr;
    return output;
}
 
istream &operator>> (istream &input, String &s)
{
    char temp[100];
    input >> setw(100) >> temp;
    s = temp;
    return input;
}

А ошибка собсвенно одна:
C++
1
2
3
obj\Debug\main.o||In function `main':|
 C++\well\main.cpp|53|undefined reference to `String::String(String const&)'|
||=== Build finished: 1 errors, 0 warnings ===|
Никак не могу разобраться!!! Компилятор говорит что у меня ошибка в
String *s4Ptr = new String (s1);. Говорит что непознанная ссылка String::String(String const&). Ничего не пойму.
String *s4Ptr = new String (s1) - если я правильно понимаю мы создаём указатель на слот памяти в котором будет храниться переменная
на основе переменной s1? Верно?
Но я не пому ещё, какая функция отвечает за создание этого? Конструктор?
Вроде не конструктор, конструктор принимае String::String(const char *s), значение константного char`а.
И тут я вроде понял что эта функция String String::operator() (int index, int subLenght), но опять же
она принимает два целых значения, а у меня Строка!!!!! new String (s1)!!! s1 - это ведь переменная типа String, который мною определён.
Вообщем я окончательно запутался, вообще в тупике.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.06.2012, 09:51     Запутался в ссылках
Посмотрите здесь:

запутался со списком C++
C++ Запутался с итераторами
Я что-то запутался C++
Запутался в циклах C++
Запутался в цикле C++
C++ Запутался в скобках
C++ Заблудился в ссылках
C++ Запутался с индексами

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
18.06.2012, 10:26     Запутался в ссылках #2
Цитата Сообщение от No10 Посмотреть сообщение
undefined reference to `String::String(String const&)'
Я этот конструктор тоже не нашел
Цитата Сообщение от No10 Посмотреть сообщение
Но я не пому ещё, какая функция отвечает за создание этого? Конструктор?
Все верно, конструктор.
Цитата Сообщение от No10 Посмотреть сообщение
Вроде не конструктор, конструктор принимае String::String(const char *s), значение константного char`а.
Конструкторов может быть несколько. Реализации требуемого у Вас как раз и не хватает. Хотя в заголовочном файле он объявлен:
C++
1
String(const String &);
, а вот в *.cpp файле его уже нет.
KATbIK
 Аватар для KATbIK
86 / 81 / 10
Регистрация: 02.08.2011
Сообщений: 335
18.06.2012, 10:27     Запутался в ссылках #3
String(const String &); - это конструктор копирования.
он утебя не определен.

Ну и на последок
C++
1
String *s4Ptr = new String ("текст");

Не по теме:

упс fasked уже написал. ))

Yandex
Объявления
18.06.2012, 10:27     Запутался в ссылках
Ответ Создать тему
Опции темы

Текущее время: 04:18. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru