Ошибка переопределение c - IT Новости из мира ПК
Remkomplekty.ru

IT Новости из мира ПК
20 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Ошибка переопределение c

Ошибка: «переопределение формального параметра»

Как исправить?

Ошибка «переопределение формального параметра с»
выдает ошибку "переопределение формального параметра с" подскажите как исправить double**.

Переопределение формального параметра
Мне нужно разбить программу на три файла. Когда вызываю эту функцию bool prov_file(ifstream file).

Error C2082: переопределение формального параметра
Добрый вечер, при создании пользовательской функции через void, появляется следующая ошибка: "error.

Так а что вы хотели этим сказать. Имя b уже занято, а вы заводите еще одну переменную b в той же области видимости. Точно так же вы могли написать

и получить аналогичную ошибку.

Попытался исправить ошибку, но на экран выводиться жесть непонятная

Добавлено через 1 минуту

Ну так вот здесь вы заставляете указатель b указывать на свежевыделенную память, заполненную мусором. Зачем вы это делаете? Зачем вы игнорируете (убиваете) переданное извне значение b и вместо него подставляете массив с мусором?

Добавлено через 3 минуты
С точки зрения здравого смысла, ваша set должна выглядеть так

Ну так хранить-то вы эту копию собрались, как a.str (aka beany.str ). Какого же черта вы тогда выделяете память для b (теряя переданное извне значение b ), а не для a.str ?

TheCalligrapher, а как его использовать то?

Добавлено через 3 минуты
Пробовал вручную задать размер и присвоить а.str = b:

Либо добавить в установки проекта, либо вписать #define _CRT_SECURE_NO_WARNINGS еще до включения стандартных заголовочных файлов.

Внимательнее надо. Вы в объявлении исправили заголовок функции на set(struct stringy &,char const *) , а в определении все оставили по старому.

TheCalligrapher, Извините но я уже в край запутался, вот целый код:

Решение

Вы уж определитесь, что вы пытаетесь делать. У вас семь пятниц на неделе.

* Если вы собрались пользоваться strcpy_s , то читайте доки по strcpy_s и вызывайте ее правильно. У нее три параметра.

* Если вы собрались пользоваться strcpy , то как я сказал выше: «. Вписать #define _CRT_SECURE_NO_WARNINGS еще до включения стандартных заголовочных файлов»

TheCalligrapher, Хух. понял, получилось. Спасибо.
Осталось это все понять и доделать задание

Добавлено через 11 минут
TheCalligrapher, Вообщем задачу сделал. Последний вопрос по этой задаче.
мы знаем что: любая динамическая память выделенная при помощи new должна освобождаться при помощи оператора delete
Как где и что мне здесь освободить?

Ошибка переопределение c

1079 просмотра

3 ответа

0 Репутация автора

Я изучаю Visual C ++ и создаю пример программы «Sketcher» из книги Ивара Хортона , и мне удалось сгенерировать панели инструментов, значки меню, подсказки и прямоугольник, нарисованный с помощью нескольких жестко закодированных точек. После добавления некоторых обработчиков мыши и ссылки на несколько других заголовочных файлов, я получаю эту ошибку: error C2011: ‘CElement’ : ‘class’ type redefinition .

Из-за этого «переопределения» в других классах фигур, которые ранее были основаны на CElement, было сгенерировано более 40 ошибок, которые не могут обнаружить этот класс во время компиляции, хотя intellisense в Visual Studio, кажется, обнаруживает его просто замечательно. Я не думаю, что мне чего-то не хватает, так как все скомпилировано должным образом до моих последних нескольких изменений, но я исчерпал свою историю отмен / повторов и, похоже, не могу найти основную причину.

Я посмотрел на некоторые другие ответы, связанные с этим сообщением об ошибке, но я все еще застрял в том, чтобы точно определить, где мой класс определяется во второй раз.

Файл My Element.h содержит следующий код:

Файл My Element.cpp содержит следующий код:

Ответы (3)

2 плюса

7661 Репутация автора

Предложение: используйте include guard во ВСЕХ ваших заголовочных файлах:

1 плюс

654 Репутация автора

как говорит FoggyDay, вам следует избегать повторного включения заголовка класса.

Другой более простой способ — просто поставить «#pragma Once» в верхнюю часть заголовка.

Автор: Jin Размещён: 29.05.2016 05:42

1 плюс

29690 Репутация автора

Читать еще:  Adsync exe системная ошибка

Вы не показали достаточно кода (даже лучше, вы бы предоставили MCVE), поэтому трудно быть уверенным.

Однако наиболее вероятным объяснением является то, что Element.h выполняется #include более одного раза в некотором модуле компиляции. Это множественное включение может быть косвенным (например, исходный файл включает в себя два (или более) разных заголовка, каждый #include «Element.h» ). Конечным результатом является то, что компилятор видит определения CElement более одного раза. Отсюда и ошибка — такое множественное определение в любом модуле компиляции является недопустимым.

Обычное решение — модифицировать Element.h с помощью include guard

Результатом этого является то, что когда Element.h имеет значение #include d более одного раза, определения не реплицируются.

Некоторые люди скажут вам использовать #pragma once в шапке. Проблема этого подхода заключается в том, что он специфичен для некоторых компиляторов, но не работает со всеми компиляторами (даже если он работает с несколькими компиляторами). Прагмы — это ловушка, предоставляемая стандартом, которая включает специфичные для компилятора расширения. Хуже того, компиляторы, которые не поддерживают #pragma once (или любую другую прагму в этом отношении), обычно просто игнорируют их без выдачи диагностики — потому что это все, что требует стандарт.

Ошибка C++ в коде (незаконная инициализация члена, переопределение типа’ class’, ‘return’: не удается преобразовать)

У меня есть ряд ошибок в коде, которые я не могу исправить.
При запуске кода у меня есть 3 различных типа ошибок:

  • незаконная инициализация участника
  • переопределение типа ‘class’
  • ‘return’ : не удается преобразовать

То, что я пытаюсь сделать, это создать космический симулятор, у которого есть меню, управляемое спереди.
Код ниже должен иметь возможность выбрать элемент, который может быть потенциально найден в космосе из следующего списка возможностей: астероид, комета, летающая тарелка, ракета, космическая станция, астронавт, спутник, мусор, Луна.

Затем этот элемент необходимо создать на заводе spaceItem.

Абстрактный Элемент Класса.ч

Вы можете помочь мне увидеть, где я иду неправильно, пожалуйста.
Спасибо!

Вот список ошибок:

spaceitems.h (13): ошибка C2504: ‘AItems’: базовый класс undefined

spaceitems.h (14): ошибка C2614: ‘Asteroid’: незаконная инициализация члена: ‘AItems’ не является базой или членом

spaceitems.h (19): ошибка C2504: ‘AItems’: базовый класс undefined

spaceitems.h (20): ошибка C2614: ‘Comet’: незаконная инициализация члена: ‘AItems’ не является базой или членом

spaceitems.h (25): ошибка C2504: ‘AItems’: базовый класс undefined

spaceitems.h (26): ошибка C2614: ‘FlyingSaucer’: незаконная инициализация члена: ‘AItems’ не является базой или членом

spaceitems.h (31): ошибка C2504: ‘AItems’: базовый класс undefined

spaceitems.H (32): ошибка C2614: ‘Rocket’: незаконная инициализация участника: ‘AItems’ не является базой или участником

spaceitems.h (37): ошибка C2504: ‘AItems’: базовый класс undefined

spaceitems.h (38): ошибка C2614: ‘SpaceStation’: незаконная инициализация участника: ‘AItems’ не является базой или участником

spaceitems.h (43): ошибка C2504: ‘AItems’: базовый класс undefined

spaceitems.h (44): ошибка C2614: «астронавт»: незаконная инициализация участника: «AItems» не является базой или участником

spaceitems.h (49): ошибка C2504: ‘AItems’: базовый класс undefined

spaceitems.h (50): ошибка C2614: ‘Satellite’ : незаконная инициализация участника: ‘AItems’ не является базой или участником

spaceitems.h (55): ошибка C2504: ‘AItems’: базовый класс undefined

spaceitems.h (56): ошибка C2614: ‘Junk’ : незаконная инициализация члена: ‘AItems’ не является базой или членом

spaceitems.h (61): ошибка C2504: ‘AItems’: базовый класс undefined

spaceitems.h (62): ошибка C2614: ‘Moon’: незаконная инициализация члена: ‘AItems’ не является базой или членом

выбранный пункт.h (33): ошибка C2440: ‘return’: не удается преобразовать из ‘Asteroid *’ в ‘ AItems *’
Типы, на которые указывают, не связаны; преобразование требует reinterpret_cast, C-style cast или function-style cast

выбранный пункт.H (35): ошибка C2440: ‘return’: не удается преобразовать из ‘Comet *’ в ‘ AItems *’
Типы, на которые указывают, не связаны; преобразование требует reinterpret_cast, C-style cast или function-style cast

выбранный пункт.h (37): ошибка C2440: ‘return’: не удается преобразовать из ‘FlyingSaucer *’ в ‘ AItems *’
Типы, на которые указывают, не связаны; преобразование требует reinterpret_cast, C-style cast или function-style cast

Читать еще:  Код ошибки msi 1406

выбранный пункт.H (39): ошибка C2440: ‘return’: не удается преобразовать из ‘Rocket *’ в ‘ AItems *’
Типы, на которые указывают, не связаны; преобразование требует reinterpret_cast, C-style cast или function-style cast

выбранный пункт.h (41): ошибка C2440: ‘return’: не удается преобразовать из ‘SpaceStation *’ в ‘ AItems *’
Типы, на которые указывают, не связаны; преобразование требует reinterpret_cast, C-style cast или function-style cast

выбранный пункт.h (43): ошибка C2440: ‘return’: не удается преобразовать из ‘Astronaut *’ в ‘ AItems *’
Типы, на которые указывают, не связаны; преобразование требует reinterpret_cast, C-style cast или function-style cast

выбранный пункт.H (45): ошибка C2440: ‘return’: не удается преобразовать из ‘Satellite *’ в ‘ AItems *’
Типы, на которые указывают, не связаны; преобразование требует reinterpret_cast, C-style cast или function-style cast

выбранный пункт.h (47): ошибка C2440: ‘return’: не удается преобразовать из ‘Junk *’ в ‘ AItems *’
Типы, на которые указывают, не связаны; преобразование требует reinterpret_cast, C-style cast или function-style cast

выбранный пункт.h (49): ошибка C2440: ‘return’: не удается преобразовать из ‘Moon *’ в ‘ AItems *’
Типы, на которые указывают, не связаны; преобразование требует reinterpret_cast, C-style cast или function-style cast

главный.cpp (13): предупреждение C4150: удаление указателя на неполный тип ‘AItems’; деструктор не вызывается

Я решил проблему. Однако он не делает то, что я хотел. Я хотел, чтобы возможность выбрать элемент, а затем отобразить элемент.

Вместо этого он отображает следующее

Item Type
0
Item Type
1
Item Type
2

Программа должна попросить у меня пункт и список, что конкретный пункт, кто-нибудь может помочь с этим, пожалуйста?

Ошибка переопределение c

1079 просмотра

3 ответа

0 Репутация автора

Я изучаю Visual C ++ и создаю пример программы «Sketcher» из книги Ивара Хортона , и мне удалось сгенерировать панели инструментов, значки меню, подсказки и прямоугольник, нарисованный с помощью нескольких жестко закодированных точек. После добавления некоторых обработчиков мыши и ссылки на несколько других заголовочных файлов, я получаю эту ошибку: error C2011: ‘CElement’ : ‘class’ type redefinition .

Из-за этого «переопределения» в других классах фигур, которые ранее были основаны на CElement, было сгенерировано более 40 ошибок, которые не могут обнаружить этот класс во время компиляции, хотя intellisense в Visual Studio, кажется, обнаруживает его просто замечательно. Я не думаю, что мне чего-то не хватает, так как все скомпилировано должным образом до моих последних нескольких изменений, но я исчерпал свою историю отмен / повторов и, похоже, не могу найти основную причину.

Я посмотрел на некоторые другие ответы, связанные с этим сообщением об ошибке, но я все еще застрял в том, чтобы точно определить, где мой класс определяется во второй раз.

Файл My Element.h содержит следующий код:

Файл My Element.cpp содержит следующий код:

Ответы (3)

2 плюса

7661 Репутация автора

Предложение: используйте include guard во ВСЕХ ваших заголовочных файлах:

1 плюс

654 Репутация автора

как говорит FoggyDay, вам следует избегать повторного включения заголовка класса.

Другой более простой способ — просто поставить «#pragma Once» в верхнюю часть заголовка.

Автор: Jin Размещён: 29.05.2016 05:42

1 плюс

29690 Репутация автора

Вы не показали достаточно кода (даже лучше, вы бы предоставили MCVE), поэтому трудно быть уверенным.

Однако наиболее вероятным объяснением является то, что Element.h выполняется #include более одного раза в некотором модуле компиляции. Это множественное включение может быть косвенным (например, исходный файл включает в себя два (или более) разных заголовка, каждый #include «Element.h» ). Конечным результатом является то, что компилятор видит определения CElement более одного раза. Отсюда и ошибка — такое множественное определение в любом модуле компиляции является недопустимым.

Читать еще:  Ошибка 80070570 при обновлении

Обычное решение — модифицировать Element.h с помощью include guard

Результатом этого является то, что когда Element.h имеет значение #include d более одного раза, определения не реплицируются.

Некоторые люди скажут вам использовать #pragma once в шапке. Проблема этого подхода заключается в том, что он специфичен для некоторых компиляторов, но не работает со всеми компиляторами (даже если он работает с несколькими компиляторами). Прагмы — это ловушка, предоставляемая стандартом, которая включает специфичные для компилятора расширения. Хуже того, компиляторы, которые не поддерживают #pragma once (или любую другую прагму в этом отношении), обычно просто игнорируют их без выдачи диагностики — потому что это все, что требует стандарт.

Вводный курс. Язык программирования Java

25. Перегрузка и переопределение методов

Перегрузка методов (overload)

Чтобы избежать дублирования методов, Java позволяет определять несколько методов с одним и тем же именем. Например, удобно, чтобы методы, которые реализуют похожий алгоритм для различных типов данных, или разного их количества имели одно и то же имя. Например:

int max(int x, int y)
int max(int x, int y, int z)
float max(float x, float y)
float max(float x, float y, float z).

При компиляции программы при обращении к методу max() в зависимости от типа и количества фактических параметров будет вызван требуемый метод.

для max(1, 2) будет вызван метод max(int x, int y),
для max(1.0, 2.0) будет вызван метод max(float x, float y).

Предоставление компилятору возможности выбора среди нескольких методов необходимого называется перегрузкой (overload). В процессе такого выбора используется понятие сигнатуры метода. В Java сигнатура метода состоит из имени метода, типа, числа и последовательности формальных параметров метода.

Имена параметров, тип возвращаемого значения, модификаторы доступа в сигнатуру не входят, например методы

publicl void draw( int x, int y)
public int draw( int color, int bkcolor)
abstract void draw (int a, int b)

имеют одинаковую сигнатуру, поскольку сигнатуру составляют: имя метода — draw, тип, число параметров и их последовательность — (int, int):

draw (int, int)
draw (int, int)
draw (int, int).

  • Перегрузка методов позволяет использовать одно и то же имя для нескольких методов с разными сигнатурами.
  • Для перегрузки методов необходимо определить методы с одним и тем же именем, которые отличаются:
    • количеством параметров
    • типом параметров
    • последовательностью типов параметров
  • В процессе компиляции определяется, какой метод следует вызвать, основываясь на количестве, типе и последовательности передаваемых параметров.
  • Имена параметров, тип возвращаемого значения и модификатор доступа метода в выборе требуемого метода не участвуют.

Переопределение методов (override)

Переопределение – это изменение реализации уже существующего в суперклассе м етода (override). В новом методе должны быть те же сигнатура и тип возвращаемого результата, что и у метода родительского класса.

Имеем родительский класс A, в нем определен метод message() . В подклассе В родительский метод переопределен.

Будет выведено:
Класс A
Класс В

Запись @Override называется аннотацией и указывает, что метод базового класса должен быть переопределен. Если в базовом классе не окажется метода с аналогичной сигнатурой, то мы получим предупреждение компилятора о том, что метод переопределить невозможно. Аннотация не влияет на переопределение метода, но служит лишь для контроля успешности переопределения. Аннотацию можно удалить, но этого делать не надо, потому что в случае ошибки вместо переопределения будет выполнена перегрузка метода.

  • при перезагрузке методы должны иметь разные сигнатуры
  • при переопределении методы должны иметь одинаковые сигнатуры
  • переопределяться могут только наследованные методы, т.е.
    полиморфизм применим только к переопределению, но не к перезагрузке.
  • методы могут быть перегружены и переопределены.
  • конструкторы могут быть только перегружены.
0 0 голоса
Рейтинг статьи
Ссылка на основную публикацию
ВсеИнструменты
×
×