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

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

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

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

21.10.2012, 09:49. Просмотров 629. Ответов 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);
};
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.10.2012, 09:49
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Переопределение тапа "class" (C++):

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

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

При компиляции ошибка: C2228: left of ".real",".imag" must have struct/class/union - C++
Помогите, пожалуйста! Компилирую в VS2010... Ошибка: C2228: left of ".real",".imag" must have struct/class/union... Почему возникает эта...

Исправить ошибку C2079 "MiniPlayer::music" использует неопределенный class "MiniMusic" - C++
Приветствую. Ситуация следующая - есть 2 класса, оба используют друг друга. При компиляции вылезает ошибка: C2079 "MiniPlayer::music"...

Объяснить причины ошибки "Extra qualification 'CLASS CONSTRUCTOR' and 'CLASS' has incomplete type" - C++
Согласно синтаксису, вроде все правильно, но ошибка... что не так? Ошибки компилятора ниже на рисунке... #include <iostream> ...

В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно" - C++
В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно". Я так...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
SergProgC++
Эксперт GPSS
315 / 317 / 59
Регистрация: 02.07.2010
Сообщений: 1,361
21.10.2012, 10:23 #2
Цитата Сообщение от DJZT Посмотреть сообщение
#include "stdafx.h"
я убрал это и у меня не матюкается
1
DJZT
24 / 3 / 0
Регистрация: 21.12.2011
Сообщений: 151
21.10.2012, 10:28  [ТС] #3
Цитата Сообщение от SergProgC++ Посмотреть сообщение
я убрал это и у меня не матюкается
Эмм.. Да. Но теперь матюкается только в одном(( но я убрал стдафикс
0
SergProgC++
Эксперт GPSS
315 / 317 / 59
Регистрация: 02.07.2010
Сообщений: 1,361
21.10.2012, 10:36 #4
а где именно матюкается проект можешь скинуть
0
DJZT
24 / 3 / 0
Регистрация: 21.12.2011
Сообщений: 151
21.10.2012, 10:39  [ТС] #5
Вот. Там ещё есть ошибок чуток - но меня щас именно эта волнует
0
Вложения
Тип файла: rar LAB1.RAR (1.14 Мб, 3 просмотров)
SergProgC++
Эксперт GPSS
315 / 317 / 59
Регистрация: 02.07.2010
Сообщений: 1,361
21.10.2012, 10:42 #6
что за среда разработки? и скопируй что за ошибку выдает
0
DJZT
24 / 3 / 0
Регистрация: 21.12.2011
Сообщений: 151
21.10.2012, 10:45  [ТС] #7
VS Express 2012
Красное - курсор ставит на ошибку
0
Миниатюры
Переопределение тапа "class"  
Изображения
 
DJZT
24 / 3 / 0
Регистрация: 21.12.2011
Сообщений: 151
21.10.2012, 10:47  [ТС] #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");
}
0
SergProgC++
Эксперт GPSS
315 / 317 / 59
Регистрация: 02.07.2010
Сообщений: 1,361
21.10.2012, 11:01 #9
Цитата Сообщение от DJZT Посмотреть сообщение
printf("Constructor is called!\n");
CData1 obj1;
в конструкторе не нужно создавать объект данного типа, конструктор это функция которая вызывается при создании
0
DJZT
24 / 3 / 0
Регистрация: 21.12.2011
Сообщений: 151
21.10.2012, 11:07  [ТС] #10
Цитата Сообщение от SergProgC++ Посмотреть сообщение
в конструкторе не нужно создавать объект данного типа, конструктор это функция которая вызывается при создании
Создал отдельную функцию создания обж. В конструкторе оставил только принт. проблема не решилась. всё таже ошибка. Ошибка вылазит в CData1.h. Не понимаю, почему
0
nonedark2008
909 / 648 / 134
Регистрация: 28.07.2012
Сообщений: 1,760
21.10.2012, 11:10 #11
У тебя нет защиты от повторноко включения файлов заголовков. Ты в мейне подключаешь CData1.h, а затем подключаешь CView.h, который опять же подключает CData.h, но класс CData1 оказывается уже определенным через первое подключение. вот он и вызает ошибку переопределния.
В качестве решения - возьми за правило в каждый .h файл добавлять:
в начало
C++
1
#pragma once
или
C++
1
2
3
4
#ifndef имя // Например _CDATA1_H_
#define имя
// Код в файле
#endif
1
DJZT
24 / 3 / 0
Регистрация: 21.12.2011
Сообщений: 151
21.10.2012, 11:22  [ТС] #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 что то возвращала?
0
nonedark2008
909 / 648 / 134
Регистрация: 28.07.2012
Сообщений: 1,760
21.10.2012, 11:27 #13
Цитата Сообщение от DJZT Посмотреть сообщение
void CreateObj(); void Screen(CData1 obj1);
Этот obj1 - это не тот, что был создан в функции CreateObj. Да, пусть функция CreateObj возвращает значение.
0
SergProgC++
Эксперт GPSS
315 / 317 / 59
Регистрация: 02.07.2010
Сообщений: 1,361
21.10.2012, 11:41 #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()
{
 
}
0
DJZT
24 / 3 / 0
Регистрация: 21.12.2011
Сообщений: 151
21.10.2012, 11:43  [ТС] #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()
{
 
}
Спасибо. Та проблема уже решена. Я уже переделал код. Раскоментил строки и немного модифицировал их. не работает создание обж.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.10.2012, 11:43
Привет! Вот еще темы с ответами:

Синтаксическая ошибка: отсутствие ";" перед "<class-head>" - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace std; int _tmain(int argc, _TCHAR* argv) class Densum { public: ...

Class "IEntity" не содержит члена "m_pEntityId" - C++
помогите 24 IntelliSense: class &quot;IEntity&quot; не содержит члена &quot;m_pEntityId&quot;

Реализовать классы "Воин", "Пехотинец", "Винтовка", "Матрос", "Кортик" (наследование) - C++
Разработать программу с использованием наследования классов, реализующую классы: − воин; − пехотинец(винтовка); − матрос(кортик). ...

visual studio 2012 - ошибка "переопределение типа" - C++
имею head.h #include &lt;stdio.h&gt; #include &lt;iostream&gt; #include &lt;Windows.h&gt; #pragma comment(lib, &quot;ws2_32&quot;) using namespace...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
21.10.2012, 11:43
Ответ Создать тему
Опции темы

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