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

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

Войти
Регистрация
Восстановить пароль
 
DJZT
24 / 3 / 0
Регистрация: 21.12.2011
Сообщений: 151
#1

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

21.10.2012, 09:49. Просмотров 605. Ответов 19
Метки нет (Все метки)

В чём проблема? Матюкается на оба файла.
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);
};
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.10.2012, 09:49     Переопределение тапа "class"
Посмотрите здесь:

переопределение типа "class" - C++
У меня такая ошибка возникает: переопределение типа "class" Знаю из-зи чего, а убрать не могу: Есть файл 1.h и 1.cpp в котором...

Переопределение типа "class" - C++
Как я понял, ошибка "переопределение типа "class"" означает что класс уже был где-то объявлен, однако у меня он вроде нигде больше не...

C2011 переопределение типа "enum" RFMapTool c:\dxsdk\include\d3d8types.h - C++
Серьезность Код Описание Проект Файл Строка Состояние подавления Ошибка C2011 _D3DZBUFFERTYPE: переопределение типа...

Переопределение оператора "меньше" пользовательского типа для работы с set - C++
Понимаю, что чтобы хранить в set элементы некоторого класса, нужно переопределить оператор < для этого класса. Оператор переопределен,...

Двусвязный список - Error C2011: ElementsList: переопределение типа "struct" - C++
Что я сделал не правильно? typedef struct ElementsList { struct ElementsList *Prev; struct ElementsList *Next; ...

Наследование, переопределение функций (из книги "Философия C++") - C++
Читаю книгу Эккеля "Философия C++", есть там такое задание: Сначала решил переопределить push_back(), сделал так: #include...

Глобальное переопределение "operator <<" для char * - C++
Здравствуйте. Привожу пример для демонстрации проблемы. Помогите пожалуйста в ее устранении или нивелировании. std::ostream&amp;...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
SergProgC++
Эксперт GPSS
314 / 316 / 59
Регистрация: 02.07.2010
Сообщений: 1,361
21.10.2012, 10:23     Переопределение тапа "class" #2
Цитата Сообщение от DJZT Посмотреть сообщение
#include "stdafx.h"
я убрал это и у меня не матюкается
DJZT
24 / 3 / 0
Регистрация: 21.12.2011
Сообщений: 151
21.10.2012, 10:28  [ТС]     Переопределение тапа "class" #3
Цитата Сообщение от SergProgC++ Посмотреть сообщение
я убрал это и у меня не матюкается
Эмм.. Да. Но теперь матюкается только в одном(( но я убрал стдафикс
SergProgC++
Эксперт GPSS
314 / 316 / 59
Регистрация: 02.07.2010
Сообщений: 1,361
21.10.2012, 10:36     Переопределение тапа "class" #4
а где именно матюкается проект можешь скинуть
DJZT
24 / 3 / 0
Регистрация: 21.12.2011
Сообщений: 151
21.10.2012, 10:39  [ТС]     Переопределение тапа "class" #5
Вот. Там ещё есть ошибок чуток - но меня щас именно эта волнует
Вложения
Тип файла: rar LAB1.RAR (1.14 Мб, 3 просмотров)
SergProgC++
Эксперт GPSS
314 / 316 / 59
Регистрация: 02.07.2010
Сообщений: 1,361
21.10.2012, 10:42     Переопределение тапа "class" #6
что за среда разработки? и скопируй что за ошибку выдает
DJZT
24 / 3 / 0
Регистрация: 21.12.2011
Сообщений: 151
21.10.2012, 10:45  [ТС]     Переопределение тапа "class" #7
VS Express 2012
Красное - курсор ставит на ошибку
Миниатюры
Переопределение тапа "class"  
Изображения
 
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
314 / 316 / 59
Регистрация: 02.07.2010
Сообщений: 1,361
21.10.2012, 11:01     Переопределение тапа "class" #9
Цитата Сообщение от DJZT Посмотреть сообщение
printf("Constructor is called!\n");
CData1 obj1;
в конструкторе не нужно создавать объект данного типа, конструктор это функция которая вызывается при создании
DJZT
24 / 3 / 0
Регистрация: 21.12.2011
Сообщений: 151
21.10.2012, 11:07  [ТС]     Переопределение тапа "class" #10
Цитата Сообщение от SergProgC++ Посмотреть сообщение
в конструкторе не нужно создавать объект данного типа, конструктор это функция которая вызывается при создании
Создал отдельную функцию создания обж. В конструкторе оставил только принт. проблема не решилась. всё таже ошибка. Ошибка вылазит в CData1.h. Не понимаю, почему
nonedark2008
881 / 620 / 125
Регистрация: 28.07.2012
Сообщений: 1,657
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
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
881 / 620 / 125
Регистрация: 28.07.2012
Сообщений: 1,657
21.10.2012, 11:27     Переопределение тапа "class" #13
Цитата Сообщение от DJZT Посмотреть сообщение
void CreateObj(); void Screen(CData1 obj1);
Этот obj1 - это не тот, что был создан в функции CreateObj. Да, пусть функция CreateObj возвращает значение.
SergProgC++
Эксперт GPSS
314 / 316 / 59
Регистрация: 02.07.2010
Сообщений: 1,361
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
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
881 / 620 / 125
Регистрация: 28.07.2012
Сообщений: 1,657
21.10.2012, 11:47     Переопределение тапа "class" #16
xD. Когда ты создаешь переменную в функции CreateObj, то по ее завершению она сразу же удалится.
Здесь надо оперировать самим классом.
Сделай конструктор, который будет инициализировать твои поля.
Тогда при:
C++
1
CData1 obj(3, 2, 1);
Вызовется конструктор(который тебе нужно еще написать) и задаст полям в переменной obj значения 3, 2, 1.
SergProgC++
Эксперт GPSS
314 / 316 / 59
Регистрация: 02.07.2010
Сообщений: 1,361
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
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
881 / 620 / 125
Регистрация: 28.07.2012
Сообщений: 1,657
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"
Еще ссылки по теме:

Ошибка "error C2011: переопределение типа" - C++
struct Tunit { public : int team; int team_agricultural; POINT location; POINT moveLocation; float max_helf; ...

Переопределение операторов, создание класса "Матрица" - C++
Здравствуйте, нужна помощь, уже очень долго не могу понять в чём проблема. Создал класс матрица, не работает простой код. Проблема в...

Ошибка: "Переопределение; Другой класс хранения" - C++
При компиляции кода: #include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;iomanip&gt; using namespace std; const int kol_airp = 7;...

Ошибка: "переопределение формального параметра" - C++
По условии задачи структуру и int.main() редактировать нельзя. Вылетает ошибка:...

Ошибка "переопределение формального параметра с" - C++
выдает ошибку &quot;переопределение формального параметра с&quot; подскажите как исправить double** nmat(double** a, double** b, int n, int m,...


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

Или воспользуйтесь поиском по форуму:
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"
Ответ Создать тему
Опции темы

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