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

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

Восстановить пароль Регистрация
 
kowandser
0 / 0 / 0
Регистрация: 01.10.2010
Сообщений: 50
04.11.2010, 03:12     Не создаётся объект класса #1
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
Опять же почему?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.11.2010, 03:12     Не создаётся объект класса
Посмотрите здесь:

В конструктор класса передать объект этого класса C++
C++ НЕ создаётся подкласс класса string
C++ Почему два раза создаётся объект с ОДНИМ И ТЕМ ЖЕ ИМЕНЕМ?
в классе создаётся объект оператором new, как его удалить после использования в основной программе? delete в вызывающей функции не вариант! C++
Не создаётся объект string на ровном месте! Почему? C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
04.11.2010, 04:04     Не создаётся объект класса #2
kowandser, Конструктор Adress ему не нравится. Хз почему
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,898
Завершенные тесты: 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 *.
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2294 / 1664 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
04.11.2010, 15:27     Не создаётся объект класса #4
Цитата Сообщение от kowandser Посмотреть сообщение
Address address ();
Скобки убрать.
Цитата Сообщение от kowandser Посмотреть сообщение
Address tre2 ("sdf", "sdf", "fdfd");
Здесь вы пытаетесь передать в конструктор три const char* строки. Такого конструктора у класса Address нет.

Чтобы в дальнейшем не возникало проблем почитайте про строки, указатели и константность.
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
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)
Crudelis
Шаровик затейник
 Аватар для Crudelis
668 / 410 / 13
Регистрация: 06.05.2010
Сообщений: 1,109
07.11.2010, 00:24     Не создаётся объект класса #6
Address() {}; изменить нужно на Address(); либо зачем мучаться, просто в классе прописать не Address() {}; а Address() {printf("Ok!");};
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.11.2010, 07:52     Не создаётся объект класса
Еще ссылки по теме:

C++ Ошибка компиляции (преобразование объекта класса в объект другого класса)
C++ Индексация массива класса, через объект этого класса
как узнать,является данный объект класса А1 наследником класса А2 C++

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

Или воспользуйтесь поиском по форуму:
kowandser
0 / 0 / 0
Регистрация: 01.10.2010
Сообщений: 50
07.11.2010, 07:52  [ТС]     Не создаётся объект класса #8
Проблема в другом была. Но уже всё ок. Всем спасибо.
Yandex
Объявления
07.11.2010, 07:52     Не создаётся объект класса
Ответ Создать тему
Опции темы

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