С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
kowandser
0 / 0 / 0
Регистрация: 01.10.2010
Сообщений: 50
#1

Не создаётся объект класса - C++

04.11.2010, 03:12. Просмотров 430. Ответов 7
Метки нет (Все метки)

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
134
135
136
137
138
---------------------------------------Address.h--------------------------------------------------
#pragma once 
 
class Address
{
public:
    const static int SIZE_COUNTRY = 3;
    const static int SIZE_POSTCODE = 7;
    const static int SIZE_REGION = 11;
    const static int SIZE_LINE = SIZE_COUNTRY + SIZE_POSTCODE + SIZE_REGION;
private:
    char Country [SIZE_COUNTRY];   //ISO-код
    char Postcode [SIZE_POSTCODE]; //Почтовый индекс
    char Region [SIZE_REGION];     //Область
public:
    //Сеттеры атрибутов
    void set (const char *C, const char *P, const char *R);
    //Геттеры атрибутов
    char * getC();
    char * getP();
    char * getR();
    Address() {};
    Address(char c[], char p[], char r[]);
    Address(const Address & add);
};
 
----------------------------------------------------Address.cpp-------------------------------------
#include "stdafx.h" 
#include "Address.h"
 
//Реализация сеттеров
void Address::set (const char *C, const char *P, const char *R)
{
    strcpy_s(Country, sizeof(Country), C);
    strcpy_s(Postcode, sizeof(Postcode), P);
    strcpy_s(Region, sizeof(Region), R);
}
//Реализация геттеров
char * getC() {return Country};
char * getP() {return Postcode};
char * getR() {return Region};
 
Address::Address() {printf("Ok!");};
 
Address::Address(char c[], char p[], char r[]) 
{
    set(c, p, r);
}
 
Address::Address (const Address & add)
{
    set(add.Country, add.Postcode, add.Region);
}
 
---------------------------------------Person.h-------------------------------------------------------
#pragma once
#include "Address.h"
 
class Person
{
private:
    Address address ();
    char Firstname [20];
    char Surname [20];
    char Patrname [20];
public:
    //Функции записи (сеттеры)
    void setFirstname (const char *s);
    void setSurname (const char *s);
    void setPatrname (const char *s);
    //Функции чтения (геттеры)
    char * getFirstname ();
    char * getSurname ();
    char * getPatrname ();
    //Конструкторы: по умолчанию, с параметрами, копирующий соответственно - и деструктор
    Person ();
    Person (char Fn[], char Sn[], char Pn[]);
    Person (const Person &obj);
    ~Person();
};
 
-----------------------------------------Person.cpp--------------------------------------------------
#include "stdafx.h"
#include <conio.h>
#include <cstdio>
#include <cstring>  
#include "Person.h" 
 
//Базовый конструктор
Person::Person()
    {
        Firstname[0] = Surname [0] = Patrname [0] = 'x00';
    }
 
//Конструктор с параметрами
Person::Person(char Fn[], char Sn[], char Pn[])
    {
        setFirstname(Fn);
        setSurname(Sn);
        setPatrname(Pn);
    }
 
//Копи-конструктор
Person::Person(const Person &obj)
    {
        setFirstname(obj.Firstname);
        setSurname(obj.Surname);
        setPatrname(obj.Patrname);
    }
 
//Деструктор
Person::~Person() 
    {
        printf("\nУдаляется объект...\n");
    }
 
//Сеттеры Person
void Person::setFirstname (const char *s) {strcpy_s(Firstname, sizeof(Firstname), s);}
void Person::setSurname (const char *s) {strcpy_s(Surname, sizeof(Surname), s);}
void Person::setPatrname (const char *s) {strcpy_s(Patrname, sizeof(Patrname), s);}
//Геттеры Person
char * Person::getFirstname () {return Firstname;}
char * Person::getSurname () {return Surname;}
char * Person::getPatrname () {return Patrname;}
 
-------------------------------------------oop2-----------------------------------------------
#include "stdafx.h"
#include "Person.h"
#include "Address.h"
#include <conio.h>
 
int _tmain(int argc, _TCHAR* argv[])
{
    Address tre1();                                                     //  1
    Address tre2 ("sdf", "sdf", "fdfd");                             //  2
    getch();
    return 0;
}

1. Не создаётся объект. Но ошибки не выскакивает. Почему?
2. Ошибка:
1>oop2.obj : error LNK2019: unresolved external symbol "public: __thiscall Address::Address(char * const,char * const,char * const)" (??0Address@@QAE@QAD00@Z) referenced in function _wmain
1>D:\CPP\oop2\Debug\oop2.exe : fatal error LNK1120: 1 unresolved externals
Опять же почему?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.11.2010, 03:12
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Не создаётся объект класса (C++):

Не создаётся объект string на ровном месте! Почему? - C++
Ребята, чё-то я не пойму: #include &lt;string&gt; #include &lt;stdio.h&gt; #include &lt;iostream&gt; using namespace std; int main () { char...

Почему при инициализации строки, сначала создаётся пустой объект? - C++
Чтобы при создании присвоить строке какое-то значение, можно использовать два способа: string str1(”bla-bla-bla”); или string str2 =...

Почему два раза создаётся объект с ОДНИМ И ТЕМ ЖЕ ИМЕНЕМ? - C++
#include &lt;windows.h&gt; #include &lt;iostream&gt; using namespace std; class arr{ public: arr(){ cout &lt;&lt; &quot;Вызов конструктора по...

Не создаётся конструктор класса - C++
Доброго времени суток. Имеется класс: class Punct_stream { string white; istringstream buffer; istream source; public:

НЕ создаётся подкласс класса string - C++
Почему, друзья? #include &lt;stdio.h&gt; #include &lt;string&gt; using namespace std; int main () { string stroka (&quot;stroka&quot;); class...

в классе создаётся объект оператором new, как его удалить после использования в основной программе? delete в вызывающей функции не вариант! - C++
Собсно //Это типа служебного класса. (Внимание! В оригинальном коде он вложен в класс xx, но я этого не стал делать, дабы не...

7
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
04.11.2010, 04:04 #2
kowandser, Конструктор Adress ему не нравится. Хз почему
1
Nick Alte
Эксперт С++
1642 / 1014 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
04.11.2010, 08:26 #3
C++
1
        Address tre2 ("sdf", "sdf", "fdfd");
Здесь вызывается конструктор с тремя строковыми литералами. Это тип const char * (то есть, содержимое этих строк вызывать нельзя). У Address такого конструктора нет, у него есть конструктор с параметрами (char [], char [], char []) - то есть, он принимает только такие строки, которые может изменять. Хотя по сути ему абсолютно ни к чему изменять передаваемые строки, надо их лишь скопировать. Решение - объявить конструктор с параметрами (const char [], const char [], const char []).
Аналогично, геттеры возвращают указатель на изменяемую строку - то есть, любой желающий сможет испохабить внутренние данные класса. Это тоже неверно, они должны возвращать const char *.
1
CyBOSSeR
Эксперт С++
2305 / 1675 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
04.11.2010, 15:27 #4
Цитата Сообщение от kowandser Посмотреть сообщение
Address address ();
Скобки убрать.
Цитата Сообщение от kowandser Посмотреть сообщение
Address tre2 ("sdf", "sdf", "fdfd");
Здесь вы пытаетесь передать в конструктор три const char* строки. Такого конструктора у класса Address нет.

Чтобы в дальнейшем не возникало проблем почитайте про строки, указатели и константность.
1
kravam
быдлокодер
1703 / 890 / 45
Регистрация: 04.06.2008
Сообщений: 5,489
07.11.2010, 00:21 #5
По идее эта штуковина не должна скомпильнуться ещё и потому, что в файле Address.cpp неизвестный идентификатор
strcpy_s

Пока не припишешь в этот файл #include <cstring>
, не компилится. У меня так, по крайней мере, MS VS 2008

Добавлено через 11 минут
...Вот ещё действительная ошибка:
Address::Address() {printf("Ok!");}; (В файле Address.cpp)

НА это ругается, что эта функция уже имеет текст реализации. И действительно:
Address() {}; (это в файле Address.h)
1
Crudelis
Шаровик затейник
676 / 418 / 13
Регистрация: 06.05.2010
Сообщений: 1,109
07.11.2010, 00:24 #6
Address() {}; изменить нужно на Address(); либо зачем мучаться, просто в классе прописать не Address() {}; а Address() {printf("Ok!");};
1
kravam
быдлокодер
1703 / 890 / 45
Регистрация: 04.06.2008
Сообщений: 5,489
07.11.2010, 00:28 #7
А вот это мне на самом деле не нравится:
C++
1
2
3
4
//Реализация геттеров
char * getC() {return Country;};
char * getP() {return Postcode;};
char * getR() {return Region;};
НАдо так:
C++
1
2
3
 char *  Address::getC() {return Country;};
char * Address::getP() {return Postcode;};
char * Address::getR() {return Region;};
Это в файле Address.cpp
1
kowandser
0 / 0 / 0
Регистрация: 01.10.2010
Сообщений: 50
07.11.2010, 07:52  [ТС] #8
Проблема в другом была. Но уже всё ок. Всем спасибо.
0
07.11.2010, 07:52
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.11.2010, 07:52
Привет! Вот еще темы с ответами:

Указатель на объект базового класса и адрес объекта производного класса - C++
Пример кода: class Class1 { public: Class1(int x) { j = new int; *j = x; } ~Class1() {delete j;}

Использование в качестве поля класса указатель на объект другого класса - C++
Ошибка в названии - &quot;указателЯ&quot; Вот, пытаюсь освоить ООП (пока только учусь): создаю класс person (человек) и car (модель машины). ...

как узнать,является данный объект класса А1 наследником класса А2 - C++
Всем привет)есть классы S, A1, A2, B1, B2. Иерархия наследования следующая S - Является родителем для всех классов и он имеет...

Ошибка компиляции (преобразование объекта класса в объект другого класса) - C++
Друзья, добрый день! Не могу понять почему выдается ошибка компиляции... Прога преобразует доллары США в старые Британские фунты. Но...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.