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

Переопределение тапа "class" - C++

Восстановить пароль Регистрация
 
DJZT
 Аватар для DJZT
24 / 3 / 0
Регистрация: 21.12.2011
Сообщений: 151
21.10.2012, 09:49     Переопределение тапа "class" #1
В чём проблема? Матюкается на оба файла.
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include "stdafx.h"
 
class CData1
{
public:
    CData1();
    ~CData1();
    int field1_data1;
    int field2_data1;
    char field3_data1[32];
    int field4_data1;
};
C++
1
2
3
4
5
6
7
#include "CData1.h"
 
class CView
{
public:
    void Screen(CData1);
};
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
SergProgC++
Эксперт GPSS
 Аватар для SergProgC++
314 / 316 / 59
Регистрация: 02.07.2010
Сообщений: 1,315
21.10.2012, 10:23     Переопределение тапа "class" #2
Цитата Сообщение от DJZT Посмотреть сообщение
#include "stdafx.h"
я убрал это и у меня не матюкается
DJZT
 Аватар для DJZT
24 / 3 / 0
Регистрация: 21.12.2011
Сообщений: 151
21.10.2012, 10:28  [ТС]     Переопределение тапа "class" #3
Цитата Сообщение от SergProgC++ Посмотреть сообщение
я убрал это и у меня не матюкается
Эмм.. Да. Но теперь матюкается только в одном(( но я убрал стдафикс
SergProgC++
Эксперт GPSS
 Аватар для SergProgC++
314 / 316 / 59
Регистрация: 02.07.2010
Сообщений: 1,315
21.10.2012, 10:36     Переопределение тапа "class" #4
а где именно матюкается проект можешь скинуть
DJZT
 Аватар для DJZT
24 / 3 / 0
Регистрация: 21.12.2011
Сообщений: 151
21.10.2012, 10:39  [ТС]     Переопределение тапа "class" #5
Вот. Там ещё есть ошибок чуток - но меня щас именно эта волнует
Вложения
Тип файла: rar LAB1.RAR (1.14 Мб, 3 просмотров)
SergProgC++
Эксперт GPSS
 Аватар для SergProgC++
314 / 316 / 59
Регистрация: 02.07.2010
Сообщений: 1,315
21.10.2012, 10:42     Переопределение тапа "class" #6
что за среда разработки? и скопируй что за ошибку выдает
DJZT
 Аватар для DJZT
24 / 3 / 0
Регистрация: 21.12.2011
Сообщений: 151
21.10.2012, 10:45  [ТС]     Переопределение тапа "class" #7
VS Express 2012
Красное - курсор ставит на ошибку
Миниатюры
Переопределение тапа "class"  
Изображения
 
DJZT
 Аватар для DJZT
24 / 3 / 0
Регистрация: 21.12.2011
Сообщений: 151
21.10.2012, 10:47  [ТС]     Переопределение тапа "class" #8
main
C++
1
2
3
4
5
6
7
8
#include "stdafx.h"
#include "CData1.h"
#include "CView.h"
 
int main(void)
{
        return 0;
}
CView.h
C++
1
2
3
4
5
6
7
#include "CData1.h"
 
class CView
{
public:
    void Screen(CData1);
};
CView.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
#include "stdafx.h"
#include "CData1.h"
#include "CView.h"
 
void CView::Screen(CData1 inputObj)
{
    printf("Унікальний ідентифікатор   = i3/n",inputObj.field1_data1);
    printf("Довжина нікнейму           = i3/n",inputObj.field2_data1);
    //printf("Нікнейм                    = c32/n",inputObj.field3_data1);
    printf("Тип основної спеціальності = i3/n",inputObj.field4_data1);
}
CData.h
C++
1
2
3
4
5
6
7
8
9
10
class CData1
{
public:
    CData1();
    ~CData1();
    int field1_data1;
    int field2_data1;
    char field3_data1[32];
    int field4_data1;
};
CData.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include "stdafx.h"
#include "CData1.h"
 
 
CData1::CData1()
{
    printf("Constructor is called!\n");
    CData1 obj1;
    obj1.field1_data1 = 0;
    obj1.field2_data1 = 4;
    //obj1.field3_data1 = "DJZT";
    obj1.field4_data1 = 5;
 
}
 
CData1::~CData1()
{
    printf("Destructor is called!\n");
}
SergProgC++
Эксперт GPSS
 Аватар для SergProgC++
314 / 316 / 59
Регистрация: 02.07.2010
Сообщений: 1,315
21.10.2012, 11:01     Переопределение тапа "class" #9
Цитата Сообщение от DJZT Посмотреть сообщение
printf("Constructor is called!\n");
CData1 obj1;
в конструкторе не нужно создавать объект данного типа, конструктор это функция которая вызывается при создании
DJZT
 Аватар для DJZT
24 / 3 / 0
Регистрация: 21.12.2011
Сообщений: 151
21.10.2012, 11:07  [ТС]     Переопределение тапа "class" #10
Цитата Сообщение от SergProgC++ Посмотреть сообщение
в конструкторе не нужно создавать объект данного типа, конструктор это функция которая вызывается при создании
Создал отдельную функцию создания обж. В конструкторе оставил только принт. проблема не решилась. всё таже ошибка. Ошибка вылазит в CData1.h. Не понимаю, почему
nonedark2008
624 / 502 / 92
Регистрация: 28.07.2012
Сообщений: 1,340
21.10.2012, 11:10     Переопределение тапа "class" #11
У тебя нет защиты от повторноко включения файлов заголовков. Ты в мейне подключаешь CData1.h, а затем подключаешь CView.h, который опять же подключает CData.h, но класс CData1 оказывается уже определенным через первое подключение. вот он и вызает ошибку переопределния.
В качестве решения - возьми за правило в каждый .h файл добавлять:
в начало
C++
1
#pragma once
или
C++
1
2
3
4
#ifndef имя // Например _CDATA1_H_
#define имя
// Код в файле
#endif
DJZT
 Аватар для DJZT
24 / 3 / 0
Регистрация: 21.12.2011
Сообщений: 151
21.10.2012, 11:22  [ТС]     Переопределение тапа "class" #12
Цитата Сообщение от nonedark2008 Посмотреть сообщение
У тебя нет защиты от повторноко включения файлов заголовков. Ты в мейне подключаешь CData1.h, а затем подключаешь CView.h, который опять же подключает CData.h, но класс CData1 оказывается уже определенным через первое подключение. вот он и вызает ошибку переопределния.
В качестве решения - возьми за правило в каждый .h файл добавлять:
в начало
C++
1
#pragma once
или
C++
1
2
3
4
#ifndef имя // Например _CDATA1_H_
#define имя
// Код в файле
#endif
Спасибо. Заработало. причём сразу всё)

Добавлено через 8 минут
Возникла другая проблема. Не работает программа
CData1.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
#include "stdafx.h"
#include "CData1.h"
#include <iostream>
 
CData1::CData1()
{
    printf("Constructor is called!\n");
    
}
 
CData1::~CData1()
{
    printf("Destructor is called!\n");
}
 
void CData1::CreateObj()
{
    CData1 obj1;
    obj1.field1_data1 = 0;
    obj1.field2_data1 = 4;
    char a[32] = "DJZT";
    strcpy_s(obj1.field3_data1, 32, a);
    //obj1.field3_data1 = "DJZT";
    obj1.field4_data1 = 5;
    printf("Created obj");
}
main
C++
1
2
3
4
5
6
7
8
9
10
11
#include "stdafx.h"
#include "CData1.h"
#include "CView.h"
 
 
int main(void)
{
    void CreateObj();
    void Screen(CData1 obj1);
    return 0;
}
Вообще ничего не выводит.

Добавлено через 1 минуту
Или надо что бы функция CreateObj что то возвращала?
nonedark2008
624 / 502 / 92
Регистрация: 28.07.2012
Сообщений: 1,340
21.10.2012, 11:27     Переопределение тапа "class" #13
Цитата Сообщение от DJZT Посмотреть сообщение
void CreateObj(); void Screen(CData1 obj1);
Этот obj1 - это не тот, что был создан в функции CreateObj. Да, пусть функция CreateObj возвращает значение.
SergProgC++
Эксперт GPSS
 Аватар для SergProgC++
314 / 316 / 59
Регистрация: 02.07.2010
Сообщений: 1,315
21.10.2012, 11:41     Переопределение тапа "class" #14
У меня вот так работает
CData1.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <windows.h>
#include <stdio.h>
 
class CData1
{
public:
    CData1();
    ~CData1();
 
    int field1_data1;
    int field2_data1;
    //obj1.field3_data1 = "DJZT";
    int field4_data1;
};
CView.h
C++
1
2
3
4
5
6
#include "CData1.h"
class CView
{
public:
    void Screen(CData1 object);
};
CData1.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include "CData1.h"
CData1::CData1(void)
{
    printf("Constructor is called!\n");
    field1_data1 = 0;
    field2_data1 = 4;
    field4_data1 = 5;
}
 
CData1::~CData1()
{
printf("Destructor is called!\n");
}
CView.cpp
C++
1
2
3
4
5
6
7
8
#include "CView.h"
void CView::Screen(CData1 object)
    {
    printf("Унікальний ідентифікатор   = i3/n",object.field1_data1);
    printf("Довжина нікнейму           = i3/n",object.field2_data1);
    //printf("Нікнейм                    = c32/n",inputObj.field3_data1);
    printf("Тип основної спеціальності = i3/n",object.field4_data1);
    }
main.cpp
C++
1
2
3
4
5
6
#include "CView.h"
 
void main()
{
 
}
DJZT
 Аватар для DJZT
24 / 3 / 0
Регистрация: 21.12.2011
Сообщений: 151
21.10.2012, 11:43  [ТС]     Переопределение тапа "class" #15
ммм... Чёт не догнал.. Собственно как я вижу функция createobj даже не вызывается. Потому что не выводится принт создание обж.
И как проверить условием что обж создан? на основе этого
C++
1
2
3
4
if (obj1)
        return 1;
    else
        return 0;
Или лучше использовать булл в данном случае?

Добавлено через 1 минуту
Цитата Сообщение от SergProgC++ Посмотреть сообщение
У меня вот так работает
CData1.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <windows.h>
#include <stdio.h>
 
class CData1
{
public:
    CData1();
    ~CData1();
 
    int field1_data1;
    int field2_data1;
    //obj1.field3_data1 = "DJZT";
    int field4_data1;
};
CView.h
C++
1
2
3
4
5
6
#include "CData1.h"
class CView
{
public:
    void Screen(CData1 object);
};
CData1.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include "CData1.h"
CData1::CData1(void)
{
    printf("Constructor is called!\n");
    field1_data1 = 0;
    field2_data1 = 4;
    field4_data1 = 5;
}
 
CData1::~CData1()
{
printf("Destructor is called!\n");
}
CView.cpp
C++
1
2
3
4
5
6
7
8
#include "CView.h"
void CView::Screen(CData1 object)
    {
    printf("Унікальний ідентифікатор   = i3/n",object.field1_data1);
    printf("Довжина нікнейму           = i3/n",object.field2_data1);
    //printf("Нікнейм                    = c32/n",inputObj.field3_data1);
    printf("Тип основної спеціальності = i3/n",object.field4_data1);
    }
main.cpp
C++
1
2
3
4
5
6
#include "CView.h"
 
void main()
{
 
}
Спасибо. Та проблема уже решена. Я уже переделал код. Раскоментил строки и немного модифицировал их. не работает создание обж.
nonedark2008
624 / 502 / 92
Регистрация: 28.07.2012
Сообщений: 1,340
21.10.2012, 11:47     Переопределение тапа "class" #16
xD. Когда ты создаешь переменную в функции CreateObj, то по ее завершению она сразу же удалится.
Здесь надо оперировать самим классом.
Сделай конструктор, который будет инициализировать твои поля.
Тогда при:
C++
1
CData1 obj(3, 2, 1);
Вызовется конструктор(который тебе нужно еще написать) и задаст полям в переменной obj значения 3, 2, 1.
SergProgC++
Эксперт GPSS
 Аватар для SergProgC++
314 / 316 / 59
Регистрация: 02.07.2010
Сообщений: 1,315
21.10.2012, 11:48     Переопределение тапа "class" #17
Опять в методе класса создаешь объект класса, у меня вот т ак работает
main.cpp
C++
1
2
3
4
5
6
7
8
9
10
#include "CView.h"
 
void main()
{
CData1 obj;
    CView obj2;
    obj2.Screen(obj);
    system("PAUSE");
 
}
DJZT
 Аватар для DJZT
24 / 3 / 0
Регистрация: 21.12.2011
Сообщений: 151
22.10.2012, 14:48  [ТС]     Переопределение тапа "class" #18
Цитата Сообщение от nonedark2008 Посмотреть сообщение
xD. Когда ты создаешь переменную в функции CreateObj, то по ее завершению она сразу же удалится.
Здесь надо оперировать самим классом.
Сделай конструктор, который будет инициализировать твои поля.
Тогда при:
C++
1
CData1 obj(3, 2, 1);
Вызовется конструктор(который тебе нужно еще написать) и задаст полям в переменной obj значения 3, 2, 1.
Я написал конструктор. Но не могу понять, почему не вызывается функция CreateObj?
main
C++
1
2
3
4
5
6
7
8
9
10
11
#include "stdafx.h"
#include "CData1.h"
#include "CView.h"
 
int main(void)
{
    printf("Main is called!\n");
    int CreateObj();
    
    return 0;
}
Матюкается на еденичку в вызове
C++
1
CData1 obj1(1, 2, "DJZT", 4);
Говорит "отсутствуют экземпляры конструктора "CData1::CData1", соответствующие списку аргументов
типы аргументов: (int, int, const char [5], int)"
.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#pragma once
 
class CData1
{
public:
    CData1();
    CData1(int f1, int f2, char f3, int f4);
    ~CData1();
    int CreateObj();
    int field1_data1;
    int field2_data1;
    char field3_data1[32];
    int field4_data1;
};

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
#include "stdafx.h"
#include "CData1.h"
#include <iostream>
 
CData1::CData1(int f1, int f2, char f3, int f4)
{
    printf("Constructor is called!\n");
    field1_data1 = f1;
    field2_data1 = f2;
    //strcpy_s(field3_data1, 32, f3);
    field4_data1 = f4;
}
 
CData1::CData1()
{
    printf("Constructor is called!\n");
}
 
CData1::~CData1()
{
    printf("Destructor is called!\n");
}
 
int CData1::CreateObj()
{
    printf("CreateObj is Called!\n");
    CData1 obj1(1, 2, "DJZT", 4);
    printf("Created obj\n");
    void Screen(CData1 obj1);
    return 1;
}


Ваш вариант работает. правда там мусор выводится, но то другое. Я не могу его использовать - у меня чётко поставлена задача, что и где вызывать.
Цитата Сообщение от SergProgC++ Посмотреть сообщение
Опять в методе класса создаешь объект класса, у меня вот так работает
main.cpp
C++
1
2
3
4
5
6
7
8
9
10
#include "CView.h"
 
void main()
{
CData1 obj;
    CView obj2;
    obj2.Screen(obj);
    system("PAUSE");
 
}
Добавлено через 2 минуты
Проблему с единицой решил.
C++
1
CData1::CData1(int f1, int f2, char f3[32], int f4)
Всё равно не вызывается функция

Добавлено через 14 минут
Сделал вот такой main
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include "stdafx.h"
#include "CData1.h"
#include "CView.h"
 
int main(void)
{
    printf("Main is called!\n");
    CData1 obj1(1, 2, "DJZT", 4);
    void Screen(CData1 obj1);
    //int CreateObj();
    
    return 0;
}
Но обж создаётся и сразу удаляется. Скрин не запускается(( Почепу так? Как сделать что бы обж сразу не удалялся? Ндо ли класс CView делать дружественным по отношению к CData1? В CView расположен метод Screen.
nonedark2008
624 / 502 / 92
Регистрация: 28.07.2012
Сообщений: 1,340
22.10.2012, 14:54     Переопределение тапа "class" #19
Метод CreateObj нестатический и находится внутри класса. Значит его можно вызвать только у переменной класса.
C++
1
2
CData1 obj(...);
obj.CrateObj() ; // Для переменной obj вызывается метод
Не нужно внутри CreateObj заводить новую переменную CData1 т. к. указатель this уже указывает на ту переменную, для которой ты вызывал метод. Если в методе CreateObj написать this->field1_data1=6 то у переменной obj соответствкющее поле изменится на 6. Для краткости this-> можно не писать.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.10.2012, 15:33     Переопределение тапа "class"
Еще ссылки по теме:

При компиляции ошибка: C2228: left of ".real",".imag" must have struct/class/union C++
Class "IEntity" не содержит члена "m_pEntityId" C++
Ошибка: "Переопределение; Другой класс хранения" C++

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

Или воспользуйтесь поиском по форуму:
DJZT
 Аватар для DJZT
24 / 3 / 0
Регистрация: 21.12.2011
Сообщений: 151
22.10.2012, 15:33  [ТС]     Переопределение тапа "class" #20
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
#include "stdafx.h"
#include "CAgent.h"
#include <iostream>
#include <string.h>
 
CAgent::CAgent(int f1, int f2, char f3[32], int f4)
{
    printf("Constructor is called!\n");
    field1_data1 = f1;
    strcpy_s(field3_data1, 32, f3);
    field2_data1 = GetLenghtNik(f3);
    field4_data1 = f4;
}
 
CAgent::CAgent()
{
    printf("Constructor is called!\n");
}
 
CAgent::~CAgent()
{
    printf("Destructor is called!\n");
}
 
int GetLenghtNik(char len[32])
{
    return strlen(len);
}
матерится на неразрешённые внешнеи элементы на методе
C++
1
field2_data1 = GetLenghtNik(f3);
Добавлено через 3 минуты
Нашёл проблему.
C++
1
2
3
4
int CAgent::GetLenghtNik(char len[32])
{
    return strlen(len);
}
а было
C++
1
2
3
4
int GetLenghtNik(char len[32])
{
    return strlen(len);
}
Yandex
Объявления
22.10.2012, 15:33     Переопределение тапа "class"
Ответ Создать тему
Опции темы

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